[PHP] 多次元配列の複数条件ソート array_multisortの使い方

投稿日:2014年4月24日

PHPで多次元配列を扱うときに、複数条件でソートしたいときがあります。
MYSQLなどではよく行うことですが、Aの列で降順にしてかつBの列で昇順にしたい!!という場合です。

こういうときに便利なのが array_multisortという関数です。

使い方がちょっと特殊なので例を挙げて説明します。


以下のような2次元配列を、年・月・日でソートしたい場合を考えます。

ソート対象配列


$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" => "愛媛" )
  );

やりたいことのイメージとしては、列で何回かソートして並び替えるけれどもそれを行ごとに並び替える、という感じです(下図参照)。
multisort

しかしそもそも、PHPの2次元配列の場合、まず行ありきで、行がさらに配列になって2次元配列を構成しています。
そこで、ソートしたい列のデータを取り出してダミー配列を作ってやります。

ダミー配列の作成


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 関数の使用


array_multisort( $tmp_year_array,
                 $tmp_month_array, SORT_ASC, SORT_NUMERIC,
                 $tmp_day_array, SORT_ASC,
                 $array_data );

引数指定のポイントとしては、一番最後の引数にソートしたい多次元配列を指定する点です。
他の引数は、「ソートしたいダミー配列、ソート順、ソート条件」、の繰り返しとなっています。ちなみに、ソート順とソート条件とは指定場所を入れ替え可能、かつ、省略可能です。(デフォルトはそれぞれ、SORT_ASC、SORT_REGULAR、です)

こうして無事多次元配列をソートすることができました。

ソート結果


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] => 高知
        )

)

南本貴之

関連記事

  • [PHP] 指定の幅で文字列をまるめる関数 mb_strimwidth[PHP] 指定の幅で文字列をまるめる関数 mb_strimwidth 「30文字以上の場合は、30文字にして最後に"…"をつける」 という風にしたい場合はけっこうあります。 本文を抜粋表示したい時などです。 しかし、『30文字以上はまるめ […]
  • [PHP] 知っていると何かの時に得する関数 checkdate, number_format, natcasesort [PHP] 知っていると何かの時に得する関数 checkdate, number_format, natcasesort PHPには、ほかの言語では考えられないほどの組み込み関数(その言語であらかじめ用意されている関数)が存在しています。 ある処理をしたい時に時間をかけてその処理を作ったら実は組み […]
  • PHPでのアップロード中の進捗バーの出し方PHPでのアップロード中の進捗バーの出し方 PHPでの大容量ファイルのアップロードについては、前回まとめました。 大容量ファイルをアップロードするには時間がかかるので、今度はアップロードの進捗を知りたくなるのが人間ってヤ […]
  • PHPでのメール送信についてPHPでのメール送信について Webサイトでお問い合わせフォームなどを利用した場合に、 内容と送信を確認するための自動返信メールが来ることがよくあります。 そうした際にPHPでのメール送信を用いることがで […]
カテゴリー: PHP, PHP 関数
  • LINEスタンプ販売中!「カフィーノ♪」 BRISKオリジナル