勉強したことのメモ

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

  関連記事

時間と数字のフォーマット

教わったのでメモ。 ・時間の整形 strtotime() 例) $ymd = ' ...

他所のサーバからWordPressの記事情報をpostIDを指定して取得する方法

他所のサーバからWPの記事IDを指定した上で、当該IDのタイトル・アイキャッチ画 ...

PHPからDBX Platformを利用してDropbox内のファイルを削除する方法

以前にPHPからDropboxのファイル一覧のデータ(ファイル名や更新日時等)を ...

PHPで引数の先頭に&(アンパサンド)をつける参照渡し(リファレンス渡し)について

他社が作成されたPHPのソースコードを拝見していると関数の引数の頭に&( ...

PHPにて特定の処理にかかった時間とメモリ使用量を測定する方法

PHPにて特定の処理にかかった時間とメモリ使用量を測定したい。以下にソースコード ...