【PHP】配列から最新の日付データを抽出する方法(usortの使い方付き)

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 を使った比較

もし dateDateTime オブジェクトであれば、次のように getTimestamp() を使って比較します。

usort($items, function ($a, $b) {
    return $b['date']->getTimestamp() - $a['date']->getTimestamp();
});

この方法では、文字列ではなくUnixタイムスタンプ(数値)で比較するため、日付としての正確な比較が可能です。


まとめ

日付付きデータから最新の1件を取得するには:

  1. usort() で日付を降順にソート(strcmp()で比較)
  2. $items[0] を取り出す
  3. 空配列チェックで安全対策

strcmp() を使えば、シンプルかつ高速に並び替えができるため、特に「YYYY-MM-DD」形式の文字列には非常に便利です。

コメント

タイトルとURLをコピーしました