カテゴリーアーカイブ PHP

村上 著者:村上

【備忘録】多次元の連想配列を複数の条件でソートする方法

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

  • この記事いいね! (0)