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() を利用すれば良いのですが、多次元の連想配列で、かつソートの条件が複数の場合は、ソート用の配列が要るなど、少しややこしかったですね。
が、今後利用する機会が多々ありそうなやり方でしたので、きちんと覚えたいと思います。