PHPで多次元の連想配列のソートをする機会があったので、備忘録として。
ソートには、「array_multisort()」という複数または多次元の配列をソートできる関数を利用します。
array_multisort()関数のマニュアルについてはこちらから。
http://php.net/manual/ja/function.array-multisort.php
今回はサンプルとして、下記のようなデータを使用します。
こちらのデータを、年齢と誕生月の昇順で並び替えを行います。
$data = array(
array("no" => "1", "name" => "田中", "age" => 30, "birth_month" => 6),
array("no" => "2", "name" => "鈴木", "age" => 15, "birth_month" => 8),
array("no" => "3", "name" => "山田", "age" => 22, "birth_month" => 11),
array("no" => "4", "name" => "遠藤", "age" => 30, "birth_month" => 9)
);
まず、ソートしたい列のデータを取り出し、ソート用の配列を作ります。
今回は、年齢と誕生月でソートしたいので、$tmp_age と $tmp_bmonthという配列を用意し、それぞれに年齢と誕生月のデータを格納します。
foreach ($data as $key => $value) {
$tmp_age[$key] = $value["age"]; // $tmp_age に年齢データ格納
$tmp_bmonth[$key] = $value["birth_month"]; // $tmp_bmont に誕生月データ格納
}
ソート用の配列に各データを格納出来たら、array_multisort()関数でソートします。
関数の引数には、「ソートしたい列データの配列」、「ソート順」、「ソート条件」という組み合わせを条件分だけ繰り返し、最後にソートしたい連想配列を指定します。
なお、「ソート順」、「ソート条件」については省略可能で、省略した場合は昇順になります。
array_multisort($tmp_age, SORT_ASC, // 年齢データを昇順でソート
$tmp_bmonth, SORT_ASC, // 誕生月データを昇順でソート
$data); // ソートしたい連想配列
なお array_multisort()は、成功した場合には TRUE を、失敗した場合に FALSE を返します。
ソート後の連想配列を var_dump で取り出してみた結果がこちら。
array(4) {
[0]=>
array(4) {
["no"]=>
string(1) "2"
["name"]=>
string(6) "鈴木"
["age"]=>
int(15)
["birth_month"]=>
int(8)
}
[1]=>
array(4) {
["no"]=>
string(1) "3"
["name"]=>
string(6) "山田"
["age"]=>
int(22)
["birth_month"]=>
int(11)
}
[2]=>
array(4) {
["no"]=>
string(1) "1"
["name"]=>
string(6) "田中"
["age"]=>
int(30)
["birth_month"]=>
int(6)
}
[3]=>
array(4) {
["no"]=>
string(1) "4"
["name"]=>
string(6) "遠藤"
["age"]=>
int(30)
["birth_month"]=>
int(9)
}
}
年齢・誕生月で正しくソートできました。
単に連想配列の昇順・降順のみでしたら、asort() や arsort() を利用すれば良いのですが、多次元の連想配列で、かつソートの条件が複数の場合は、ソート用の配列が要るなど、少しややこしかったですね。
が、今後利用する機会が多々ありそうなやり方でしたので、きちんと覚えたいと思います。