[PHP] 図解 array_multisort()
序文
array_multisort()は、豊富にある配列ソート関数の中の一つですが、
使い方を調べるためにマニュアルを見てもよくわからなかったので、図示して理解しました。
というわけで、array_multisort()がよくわからない人向けの解説です。
かんたんな例
$arr1 = [10, 100, 1, 0]; $arr2 = [3, 2, 1, 0];
この二つの配列をarray_multisort()を使ってソートしてみます。
array_multisort($arr1, $arr2);
まず$arr1のソートが実行されます
ここではソート方法とソート順を引数で指定していないので、緩やかな比較かつ昇順となります。
$arr1のソート前後の要素の動きを図示したものが次の画像です。
このとき、
(B) 1番目の要素はソート後3番目
(C) 2番目の要素はソート後1番目
(D) 3番目の要素はソート後0番目
というルールが作成され、$arr2のソート時にそれが適用されます。
$arr2のソート前後の要素の動きは次にようになります。
引数にさらにひとつ配列を渡していた場合は、その配列のソートには$arr2のソート結果が影響を及ぼします。
むずかしい例
$arr3 = [500, 100, 250, 0, 500, 100]; $arr4 = [5, 4, 3, 2, 1];
この二つの配列をarray_multisort()を使ってソートしてみます。
array_multisort($arr3, $arr4);
まず$arr3のソートが実行されます
先の例と同様、ソート方法とソート順を引数で指定していないので、緩やかな比較かつ昇順となります。
$arr3のソート前後の要素の動きを図示したものが次の画像です。
このとき、
(b) 1番目と5番目の要素はソート後1番目か2番目
(c) 2番目の要素はソート後3番目
(d) 3番目の要素はソート後0番目
というルールが作成され、$arr4のソート時にそれが適用されます。
先の例と大きく違うのは、$arr3には同じ数値が2セットあることです。
100と100, 500と500は同じ大きさ(=比較結果が等しい)なので、
この時点ではソート後の配置先がルール(a),(b)のように不定になります。
さて$arr4のソート結果はどうなるのかというと、こうなります。
ルール(c),(d)はそのまま執行されます。
(a)に関しては、対応する要素(4,0)に引数で指定されたソート方法が適用されます。
この例では$arr4のソート方法を指定していないのでデフォである昇順になります。
(b)も同様に、対応する要素(5,1)が昇順に配置されます。
$arr4のソートの結果、以降の配列(引数として渡されていれば)には
(a-2) 4番目の要素はソート後4番目
(b-1) 1番目と要素はソート後2番目
(b-2) 5番目と要素はソート後1番目
(c) 2番目の要素はソート後3番目
(d) 3番目の要素はソート後0番目
というルールが適用されます。
すごーい
補足
$arr5 = [0, false]; $arr6 = [100, 200];
という配列があり、
array_multisort($arr5, $arr6);
とした結果、
$arr5の中身が [false, 0] になったとしても、
$arr6 の中身は [200, 100] にはなりません。
緩やかな比較では0とfalseは等しくなるためです。
このあたりの動作についてはマニュアルをご参照ください。
おわり