PHPで多次元配列を扱うときに、複数条件でソートしたいときがあります。
MYSQLなどではよく行うことですが、Aの列で降順にしてかつBの列で昇順にしたい!!という場合です。
こういうときに便利なのが array_multisortという関数です。
使い方がちょっと特殊なので例を挙げて説明します。
以下のような2次元配列を、年・月・日でソートしたい場合を考えます。
ソート対象配列
1 2 3 4 5 6 7 8 9 | $array_data = array( array( "year" => "2014", "month" => "04", "day" => "24", "place" => "徳島" ), array( "year" => "2014", "month" => "4" , "day" => "23", "place" => "香川" ), array( "year" => "2014", "month" => "04", "day" => "25", "place" => "高知" ), array( "year" => "2013", "month" => "05", "day" => "05", "place" => "愛媛" ) ); |
やりたいことのイメージとしては、列で何回かソートして並び替えるけれどもそれを行ごとに並び替える、という感じです(下図参照)。
しかしそもそも、PHPの2次元配列の場合、まず行ありきで、行がさらに配列になって2次元配列を構成しています。
そこで、ソートしたい列のデータを取り出してダミー配列を作ってやります。
ダミー配列の作成
1 2 3 4 5 6 7 | foreach( $array_data as $key => $row ) { $tmp_year_array[$key] = $row["year"]; $tmp_month_array[$key] = $row["month"]; $tmp_day_array[$key] = $row["day"]; } |
作成したダミー配列を条件によりソートして、その結果を2次元配列に反映して並べ替えてくれるのが array_multisort 関数です。
array_multisort 関数の使用
1 2 3 4 5 6 | array_multisort( $tmp_year_array, $tmp_month_array, SORT_ASC, SORT_NUMERIC, $tmp_day_array, SORT_ASC, $array_data ); |
引数指定のポイントとしては、一番最後の引数にソートしたい多次元配列を指定する点です。
他の引数は、「ソートしたいダミー配列、ソート順、ソート条件」、の繰り返しとなっています。ちなみに、ソート順とソート条件とは指定場所を入れ替え可能、かつ、省略可能です。(デフォルトはそれぞれ、SORT_ASC、SORT_REGULAR、です)
こうして無事多次元配列をソートすることができました。
ソート結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | Array ( [0] => Array ( [year] => 2013 [month] => 05 [day] => 05 [place] => 愛媛 ) [1] => Array ( [year] => 2014 [month] => 4 [day] => 23 [place] => 香川 ) [2] => Array ( [year] => 2014 [month] => 04 [day] => 24 [place] => 徳島 ) [3] => Array ( [year] => 2014 [month] => 04 [day] => 25 [place] => 高知 ) ) |
南本貴之