PHPで「複数のデータの中から、最新の日付を持つ1件を取り出す」ような処理は、履歴管理やイベント一覧などでよく使われます。
今回はそのようなケースに使える、usort()
を用いた日付降順ソート+抽出処理を分かりやすく解説します。
サンプルコードとその解説
以下は、日付付きデータの配列 $items
から、一番最近のデータを取り出すコードです。
<?php
// 日付付きデータの配列(例)
$items = [
['date' => '2024-06-10', 'title' => 'データA'],
['date' => '2024-07-01', 'title' => 'データB'],
['date' => '2024-05-15', 'title' => 'データC'],
];
// 最新データを格納する変数
$latestItem = null;
// 配列が空でないか確認
if (!empty($items)) {
// date を基準に降順(新しい順)に並び替える
usort($items, function ($a, $b) {
// 'YYYY-MM-DD' 形式の文字列同士を比較
return strcmp($b['date'], $a['date']);
});
// 並び替えた先頭が最新データ
$latestItem = $items[0];
}
// 結果を出力
if ($latestItem !== null) {
echo "最新のデータは「{$latestItem['title']}」、日付は {$latestItem['date']} です。";
} else {
echo "データが存在しません。";
}
strcmp()とは?なぜ使うのか?
strcmp($b['date'], $a['date']);
この関数は、2つの文字列を比較して、どちらが大きいか(辞書順)を判断します。
- 返り値が負の値:第1引数が小さい
- 返り値が0:同じ
- 返り値が正の値:第1引数が大きい
このコードでは、$b['date']
と $a['date']
を比較しているため、新しい日付(大きい文字列)を先頭にする降順ソートになります。
日付を文字列で比較できる理由
date
フィールドが「YYYY-MM-DD
」という形式であるため、文字列として比較しても時系列と一致します。
例:
"2024-07-01"
>"2024-06-10"
"2024-06-10"
>"2024-05-15"
そのため、strtotime()
などを使わなくても、strcmp()
で正しく並び替えることが可能です。
応用:DateTime を使った比較
もし date
が DateTime
オブジェクトであれば、次のように getTimestamp()
を使って比較します。
usort($items, function ($a, $b) {
return $b['date']->getTimestamp() - $a['date']->getTimestamp();
});
この方法では、文字列ではなくUnixタイムスタンプ(数値)で比較するため、日付としての正確な比較が可能です。
まとめ
日付付きデータから最新の1件を取得するには:
usort()
で日付を降順にソート(strcmp()
で比較)$items[0]
を取り出す- 空配列チェックで安全対策
strcmp()
を使えば、シンプルかつ高速に並び替えができるため、特に「YYYY-MM-DD」形式の文字列には非常に便利です。
コメント