勉強したことのメモ

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のHTTPクライアント用ライブラリ「Guzzle」の利用方法

以前に「Requests for PHP」を試したが、似たようなライブラリで「G ...

imgタグのsrc属性のURLにPHPでタイムスタンプを付与しキャッシュ対策する方法

imgタグで画像を表示する際、画像を書き換えても同じものが表示されるというケース ...

PHPで縦横どちらかが指定の長さを超えた場合、比率を保ったままリサイズ

PHPで縦横どちらかが指定の長さを超えた場合、 比率を保ったままリサイズしたかっ ...

PHPにてhosts設定を行った上で他サイト・サーバにアクセスする方法

開発中の案件だとhosts設定を行ってサーバにアクセスする、ということがある。作 ...

CodeIgniter4の各種設定項目のまとめ記事

CodeIgniter4.4.4の各種設定項目を後から確認できるようまとめておき ...