【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

[PHP] 図解 array_multisort()

PHP

序文

array_multisort()は、豊富にある配列ソート関数の中の一つですが、
使い方を調べるためにマニュアルを見てもよくわからなかったので、図示して理解しました。
というわけで、array_multisort()がよくわからない人向けの解説です。

 

かんたんな例

$arr1 = [10, 100, 1, 0];
$arr2 = [3, 2, 1, 0];

この二つの配列をarray_multisort()を使ってソートしてみます。

array_multisort($arr1, $arr2);

まず$arr1のソートが実行されます
ここではソート方法とソート順を引数で指定していないので、緩やかな比較かつ昇順となります。
$arr1のソート前後の要素の動きを図示したものが次の画像です。

このとき、

(A) 0番目の要素はソート後2番目
(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のソート前後の要素の動きを図示したものが次の画像です。

このとき、

(a) 0番目と4番目の要素はソート後4番目か5番目
(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-1) 0番目の要素はソート後5番目
(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は等しくなるためです。
このあたりの動作についてはマニュアルをご参照ください。

 

おわり

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
0
読み込み中...
0 票, 平均: 0.00 / 10
746
X facebook はてなブックマーク pocket
【2026.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2026.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

この記事をかいた人

About the author