はじめに
PHPで多次元配列を特定の条件でソートしたいときがあります。
少し使い方にクセがあるので例を元に説明します。
対象の多次元配列
$data = [
['2021-05-01', 1, 'hoge'],
['2021-04-02', 2, 'fuga'],
['2021-05-02', 3, 'piyo']
];
上記のような多次元配列があり、年月日でソートを行います。
このときに使用する関数はarray_multisort
を使用します。
array_multisortの使い方
array_multisort
関数の具体的な使い方を説明してきます。
実装例
$data = [
['2021-05-01', 1, 'hoge'],
['2021-04-02', 2, 'fuga'],
['2021-05-02', 3, 'piyo']
];
array_multisort( // 3
array_map("strtotime", // 2
array_column($data, 0) // 1
),
SORT_ASC,
$data
);
var_dump($data);
ここから上記実装を一つ一つ説明していきます。
1. array_column関数について
array_column($data, 0)
で$data
配列から単一のカラムの値を返します。
ここでは下記のようなデータが返ってきます。
array(3) {
[0]=>
string(10) "2021-05-01"
[1]=>
string(10) "2021-04-02"
[2]=>
string(10) "2021-05-02"
}
2. array_map関数について
array_column
関数で返ってきた日付文字列の配列要素一つずつにarray_map
関数を使い処理を行います。strtotime
関数で文字列をUnixタイムスタンプに変換します。
結果、下記のような配列が返ってきます。
array(3) {
[0]=>
int(1619827200)
[1]=>
int(1617321600)
[2]=>
int(1619913600)
}
3. array_multisort関数について
array_map
関数で返ってきた配列をSORT_ASC
で昇順並びに変更します。
元の$data
配列をSORT_ASC
で並び替えた順序に対応します。
以下、最終的な$data
の配列の形です。
array(3) {
[0]=>
array(3) {
[0]=>
string(10) "2021-04-02"
[1]=>
int(2)
[2]=>
string(4) "fuga"
}
[1]=>
array(3) {
[0]=>
string(10) "2021-05-01"
[1]=>
int(1)
[2]=>
string(4) "hoge"
}
[2]=>
array(3) {
[0]=>
string(10) "2021-05-02"
[1]=>
int(3)
[2]=>
string(4) "piyo"
}
}
array_multisort
には複数の配列を与えることができます。array_multisort
は与える配列の要素数はすべて同じである必要があります。
最初の配列をソートし同じ要素があった場合、後に続く配列の要素を使い順番を決めます。
まとめ
今回は多次元配列のソートする方法を紹介しました。
多次元配列は使用する場面も多いと思いますので、ソートする方法に迷ったら参考にしてみてください。