概要
キー列が同じ連想配列を要素とする配列の要素を特定のキーに従ってソートするには、以下のようにarray_column()
とarray_multisort()
を使う。
1 |
array_multisort(array_column('キー名'), SORT_ASC, 対象の配列); |
問題
以下のような配列があり、この配列の要素をname
やage
などで並べ替える方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$students = [ [ 'name' => 'Dick', 'age' => 32, 'courses' => ['Math', 'Physics',], ], [ 'name' => 'Alice', 'age' => 25, 'courses' => ['History', 'Geology',], ], [ 'name' => 'Bob', 'age' => 43, 'courses' => ['Music', 'Ethics'], ], ]; |
array_multisort()を使う
array_multisort()
は第1引数指定した1次元配列の順番に従って、第3引数の配列の要素をソートする。第2引数にはソートの昇順/降順を指定する。
たとえば以下の例では、2つの要素を持つ連想配列の配列を並べ替えている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$a = [['one', 'first'], ['two', 'second'], ['three', 'third'],]; array_multisort([3, 2, 1], SORT_ASC, $a); print_r($a); // Array // ( // [0] => Array // ( // [0] => three // [1] => third // ) // [1] => Array // ( // [0] => two // [1] => second // ) // [2] => Array // ( // [0] => one // [1] => first // ) // ) |
この例の流れは以下のとおり。
- 第1引数の配列
[3, 2, 1]
の各要素が$a
の各要素に対応している - 第2引数で昇順(
SORT_ASC
)を指定 - 第3引数の配列がこれに従って並べ替えられ、内容が変更される
なお第1引数と第3引数の次数が等しくない場合はWarningとなり、第3引数の配列は変更されずに処理が進む。
また、第1引数の配列の要素が文字列の場合は辞書順で並べ替えられる。
array_column()
array_multisort()
の第1引数に第3引数のあるキー列を選べば、そのキー列に従って並べ替えられる。
問題の配列の'age'
のキー列は以下のとおり。
1 2 3 4 5 6 7 8 |
print_r(array_column($students, 'age')); // Array // ( // [0] => 32 // [1] => 25 // [2] => 43 // ) |
手順
このキー列の値の昇順で元の配列を並べ替えるには、第1引数に上のarray_culumn()
を適用すると、'age'
の昇順で配列が並べ替えられる。
降順に並べ替えたいときはSORT_DESC
を指定する。
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 |
array_multisort(array_column($students, 'age'), SORT_ASC, $students); print_r($students); // Array // ( // [0] => Array // ( // [name] => Alice // [age] => 25 // [courses] => Array // ( // [0] => History // [1] => Geology // ) // ) // [1] => Array // ( // [name] => Dick // [age] => 32 // [courses] => Array // ( // [0] => Math // [1] => Physics // ) // ) // [2] => Array // ( // [name] => Bob // [age] => 43 // [courses] => Array // ( // [0] => Music // [1] => Ethics // ) // ) // ) |