本記事は執筆時点(2024年06月13日)の情報をベースにしております。掲載している情報が最新ではない可能性がありますので何卒ご容赦ください。
array_multisort関数について
LaravelでのWebアプリ制作の実務において、多次元配列のソートを行う状況があり、その際array_multisort関数について学んだので、覚えた内容を備忘録として残しておきます。
(※array_multisort関数について完全に理解できている訳ではないので、説明が至らない部分があることをご容赦ください。)
PHPで配列のソートを行う方法は他にもありますが、array_multisort関数を使えば、とても簡潔なコードで多次元配列を任意の条件・順序で並び替えを行うことができます。
array_multisortで並び替えを行う方法
array_multisort関数は次のように記述して引数を指定し、元となる配列のソートを行います。
実際に下の例で、「id」「name」「age」といったキーを持つ多次元連想配列に対して、array_multisortを用いてageキーの値が大きい順に並び替えを行ってみます。
array_columnと組み合わせて使う
array_multisortによる多次元配列の並び替えは、array_column関数と組み合わせて行います。
array_columnは、多次元配列から特定のカラムの値のみを抽出して新しい配列を生成する関数です。
array_columnについて詳しくはこちらのページをご覧ください。
PHP
$arr = [ ['id' => 1, 'name' => '東京太郎', 'age' =>'24', 'furigana' => 'トウキョウタロウ'], ['id' => 2, 'name' => '埼玉次郎', 'age' =>'35', 'furigana' => 'サイタマジロウ'], ['id' => 3, 'name' => '千葉花子', 'age' =>'21', 'furigana' => 'チバハナコ'], ['id' => 4, 'name' => '神奈川一郎', 'age' =>'48', 'furigana' => 'カナガワイチロウ'], ]; $target_column = array_column($arr,'age'); array_multisort($target_column,SORT_DESC,$arr); var_dump($arr);
上記のコードを説明すると…、
7行目array_columnを用いてageカラムの値だけを抽出し、ソートの基準となる配列($target_column)を用意します。
8行目array_multisortの引数に「ソートの基準となる配列($target_column)、「ソート順序(大きい順にしたいのでSORT_DESC)」、「ソートしたい配列($arr)」をセットします。
9行目元の配列が並び替えできているか、結果を確認します。
結果
array(4) { [0]=> array(4) { ["id"]=> int(4) ["name"]=> string(15) "神奈川一郎" ["age"]=> string(2) "48" ["furigana"]=> string(24) "カナガワイチロウ" } [1]=> array(4) { ["id"]=> int(2) ["name"]=> string(12) "埼玉次郎" ["age"]=> string(2) "35" ["furigana"]=> string(21) "サイタマジロウ" } [2]=> array(4) { ["id"]=> int(1) ["name"]=> string(12) "東京太郎" ["age"]=> string(2) "24" ["furigana"]=> string(24) "トウキョウタロウ" } [3]=> array(4) { ["id"]=> int(3) ["name"]=> string(12) "千葉花子" ["age"]=> string(2) "21" ["furigana"]=> string(15) "チバハナコ" } }
元の配列を「age(年齢)」の数値が大きい順(DESC)に並び替えることができました。
2つ目の並び替え基準を設定する
並び替え基準(ソート基準)に同じ値が存在する場合には、引数を追加して2つ目のソート基準を設定しておくことで意図した順番に並び替えすることができます。
1つ目のソート基準において同じ値を持つレコードに関しては、2つ目のソート基準で並び替えが行われます。
先ほどの例の配列にageの値が重複するレコードを加え、重複した場合はidが大きい順に並ぶように指定してみたいと思います。
PHP
$arr = [ ['id' => 1, 'name' => '東京太郎', 'age' =>'24', 'furigana' => 'トウキョウタロウ'], ['id' => 2, 'name' => '埼玉次郎', 'age' =>'35', 'furigana' => 'サイタマジロウ'], ['id' => 3, 'name' => '千葉花子', 'age' =>'21', 'furigana' => 'チバハナコ'], ['id' => 4, 'name' => '神奈川一郎', 'age' =>'48', 'furigana' => 'カナガワイチロウ'], ['id' => 5, 'name' => '茨城春子', 'age' =>'48', 'furigana' => 'イバラキハルコ'], ]; $target_column = array_column($arr,'age'); $target_column2 = array_column($arr,'id'); array_multisort( $target_column, SORT_DESC, $target_column2, SORT_DESC, $arr ); var_dump($arr);
上記のコードを説明すると…、
6行目ageの値(48)が重複するレコードを加えました。
9行目同じようにarray_columnを用いてidカラムの値だけを抽出し、2つ目のソート基準となる配列($target_column2)を用意します。
13行目と14行目array_multisortの引数に2つ目の「ソートの基準となる配列($target_column2)、「ソート順序(大きい順にしたいのでSORT_DESC)」を追記します。
結果
array(5) { [0]=> array(4) { ["id"]=> int(5) ["name"]=> string(12) "茨城春子" ["age"]=> string(2) "48" ["furigana"]=> string(21) "イバラキハルコ" } [1]=> array(4) { ["id"]=> int(4) ["name"]=> string(15) "神奈川一郎" ["age"]=> string(2) "48" ["furigana"]=> string(24) "カナガワイチロウ" } [2]=> array(4) { ["id"]=> int(2) ["name"]=> string(12) "埼玉次郎" ["age"]=> string(2) "35" ["furigana"]=> string(21) "サイタマジロウ" } [3]=> array(4) { ["id"]=> int(1) ["name"]=> string(12) "東京太郎" ["age"]=> string(2) "24" ["furigana"]=> string(24) "トウキョウタロウ" } [4]=> array(4) { ["id"]=> int(3) ["name"]=> string(12) "千葉花子" ["age"]=> string(2) "21" ["furigana"]=> string(15) "チバハナコ" } }
「age」の数値が大きい順かつ、その値が重複した場合は「id」の数値が大きい順に並び替えることができました。
文字を比較して並び替えを行う
並び替えの比較対象を文字列にしたい場合は、第4引数に「SORT_STRING」を設定します。
第4引数は省略可能であり、省略すると「SORT_REGULAR」が適用され、数値として比較されます。
例として、先ほどの配列に「age」キーの値が同じレコードをもう一つ追加し、重複した場合は「アイウエオ順」に並び替えてみます。
PHP
$arr = [ ['id' => 1, 'name' => '東京太郎', 'age' =>'24', 'furigana' => 'トウキョウタロウ'], ['id' => 2, 'name' => '埼玉次郎', 'age' =>'35', 'furigana' => 'サイタマジロウ'], ['id' => 3, 'name' => '千葉花子', 'age' =>'21', 'furigana' => 'チバハナコ'], ['id' => 4, 'name' => '神奈川一郎', 'age' =>'48', 'furigana' => 'カナガワイチロウ'], ['id' => 5, 'name' => '茨城春子', 'age' =>'48', 'furigana' => 'イバラキハルコ'], ['id' => 6, 'name' => '栃木三郎', 'age' =>'48', 'furigana' => 'トチギサブロウ'], ]; $target_column = array_column($arr,'age'); $target_column3 = array_column($arr,'furigana'); array_multisort( $target_column, SORT_DESC, $target_column3, SORT_ASC, SORT_STRING, $arr ); var_dump($arr);
上記のコードを説明すると…、
6行目ageの値(48)が重複するレコードを加えました。
9行目同じようにarray_columnを用いてfuriganaカラムの値だけを抽出し、2つ目のソート基準となる配列($target_column3)を用意します。
13行目と14行目array_multisortの引数に2つ目の「ソートの基準となる配列($target_column3)、「ソート順序(アイウエオ順にしたいのでSORT_ASC)」、「文字列なのでSORT_STRING」を追記します。
結果
array(6) { [0]=> array(4) { ["id"]=> int(5) ["name"]=> string(12) "茨城春子" ["age"]=> string(2) "48" ["furigana"]=> string(21) "イバラキハルコ" } [1]=> array(4) { ["id"]=> int(4) ["name"]=> string(15) "神奈川一郎" ["age"]=> string(2) "48" ["furigana"]=> string(24) "カナガワイチロウ" } [2]=> array(4) { ["id"]=> int(6) ["name"]=> string(12) "栃木三郎" ["age"]=> string(2) "48" ["furigana"]=> string(21) "トチギサブロウ" } //以下省略
まとめ
以上が、array_multisortを使ってPHPで多次元配列の並び替え(ソート)を行う方法です。
並び順はもちろん、2つ目3つ目のソート基準まで指定できるのでいろいろと役立つ関数だと感じました。