【PHP】 配列を配列内の日付順でソートする
update :
日付のキーを持つ配列をその日付順でソートしたいときがあります。その場合、array_multisortを利用しますが、array_columnとarray_mapを併用できるととても便利です。
ソートするサンプル配列コード
以下の配列をdateキーの値(日付)の降順にソートしてみます。
Array
(
[0] => Array
(
[id] => 1
[date] => 2022-01-01
[contents] => id01の内容
)
[1] => Array
(
[id] => 2
[date] => 2022-04-01
[contents] => id02の内容
)
[2] => Array
(
[id] => 3
[date] => 2022-02-01
[contents] => id03の内容
)
[3] => Array
(
[id] => 4
[date] => 2022-11-01
[contents] => id04の内容
)
[4] => Array
(
[id] => 5
[date] => 2022-08-01
[contents] => id05の内容
)
)
コピペ用の正解コード
以下のコードで一発です。SORT_DESCとしているので降順ですが、ソート順を省略もしくはSORT_ASCとすると昇順でソートされます。
array_multisort(array_map("strtotime", array_column($dat,"date")),SORT_DESC,$dat);
| SORT_ASC | 昇順(省略しても同様) |
| SORT_DESC | 降順 |
お勉強用
順を追って説明していきます。分解すると以下の様なコードになります。
// |
// | array_column
// |
$date = array_column($dat,"date");
// |
// | array_map
// |
$date = array_map("strtotime",$date);
// |
// | array_multisort
// |
array_multisort($date,SORT_DESC,$dat);
1.array_columnで日付のみの配列を生成
先ずarray_columnで日付が格納されているキーを指定して、日付のみの配列を生成します。foreachなどで生成しているサンプルをよく見ますが、array_columnで一発です。
2.strtotimeとarray_mapで「日付」として認識できるようにタイムスタンプ形式に変換する
生成された配列には日付が格納されていますが、これは日付のように見えてプログラムからすると単なる文字列なので「プログラムに対して日付」になるようstrtotime関数を使って変換します。このときarray_mapを使用すると非常に便利です。array_mapは配列の値全てに対して同様の関数を適用してくれます。正しい言い方をすると、配列の値に対してのコールバック関数を指定できます。
3.array_multisortで日付順にソートする
array_multisortを使用して、2で生成された配列をもとに対象配列をソートします。