MW211 EXIT

devlog
PHP/配列の並び順が意図した通りかの判定
2011年11月16日
値がしっかりと昇順になっているものと、なっていないものがあった場合
これを判定したいとする。

例えば以下の二つの配列のうち、$bは不正だとはじきたい場合などだ。
┌──────────────────────────────────────┐
│$a = array(0=>0, 1=>1, 2=>2);                                               │
│$b = array(0=>0, 1=>2, 2=>1);                                               │
└──────────────────────────────────────┘

一旦、ダミーをつくりそれを「arsort()」で昇順ソートする。
┌──────────────────────────────────────┐
│$a_dummy = $a;                                                              │
│arsort($a_dummy);                                                           │
└──────────────────────────────────────┘
んでもって、元の配列と比較して、差分がなければ(変化がなければ)
昇順だったってことになる

しかし、ここで注意しなければならないのは「array_diff()」を使わないこと
┌──────────────────────────────────────┐
│if (array_diff($a, $a_dummy)) {                                             │
│  echo '昇順でない';                                                        │
│}                                                                           │
└──────────────────────────────────────┘
この関数は並び順度外視で、要素の比較だけに専念するので
差分なしと判定されてしまう。

正しくは「!==」で厳密に比較してあげればよい。
┌──────────────────────────────────────┐
│if ($a !== $a_dummy) {                                                      │
│  echo '昇順でない';                                                        │
│}                                                                           │
└──────────────────────────────────────┘
これなら並び順が違うだけでも、検出してくれる。

なお、降順で判定したい場合は、「asort()」を「arsort()」にすればいい。
分類:PHP配列