勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPにて指定した期間内の日付を1日ずつループで出力する方法

  PHP

PHPにて開始日と終了日をユーザが入力すると、その期間内の日付をYYYY-MM-DD形式で1日ずつループで出力させたいというケースがあった。ループで回しながらstrtotimeで1日ずつ追加していけばいいかと思ったけど、他にも何か方法が無いか探したところ良い対応方法があった。以下に対応方法をメモ。

 

対応方法

パターン1

最初に思いついたパターン。ソースコードをぱっと見た時に何をしているのか(個人的には)分かりやすい。

$start = '2024-01-01';
$end = '2024-01-07';

for( $day = $start; $day <= $end; $day = date('Y-m-d', strtotime($day . '+1 day')) ){
    var_dump($day);
}

パターン2

DateTimeクラスを使用しつつループで回す方法。これもソースコードをぱっと見た時に何をしているのか(個人的には)分かりやすい。また、パターン1のfor文よりスマートに見える。

$start = new Datetime('2024-01-01');
$end = new Datetime('2024-01-07');

while( $start <= $end ){
    var_dump($start->format('Y-m-d'));
    $start->modify('+1 day');
}

パターン3

DatePeriodクラスを使用しつつループで回す方法。DatePeriodクラスというのを知らなかったのでぱっと見ても何をしているのか分からなかった。

$start = new DateTimeImmutable('2024-01-01T00:00');
$end = new DateTimeImmutable('2024-01-07T24:00');
$interval = new DateInterval('P1D');
$period = new DatePeriod($start, $interval, $end);

foreach( $period as $day ){
    var_dump($day);
}

 

実行速度

期間を20年分に指定し、それぞれのパターンで数回ほど試したところ以下の実行速度となった。

  • パターン1 → 約0.0065秒
  • パターン2 → 約0.0034秒
  • パターン3 → 約0.002秒

 

所感

可読性も考慮すると個人的にはパターン2を使っていきたいところ。

 - PHP

  関連記事

PHPとSQLiteで簡易BBSの作成

PHPとSQLiteの練習で簡易掲示板を作ったのでメモ。   目次1 ...

mpdfで「The /e modifier is …」エラー発生時の対応方法

pdf関連のPHPライブラリ「mPDF」を使っているページがエラーログにのってお ...

PHPで日付の比較

以前に「締切日を設けて、今日の日付と比較して分岐させる」というもので 日付の比較 ...

PHPで「Warning: date(): It is not safe to…」エラーの対応方法

PHPでdate関数を使った際に「Warning: date(): It is ...

jQueryからAjax経由でPHPにリクエストしCookieを操作する方法

先日PHPでCookie保存時にHttpOnly / Secure属性を設定する ...