PHPにて指定した期間内の日付を1日ずつループで出力する方法
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 / metaタグ / htaccess)の方法で301リダイレクト
サイトのディレクトリやファイル名を大幅に変えるという案件があった。それ自体は問題 ...
-
-
PHPで「operator not supported for strings」エラーの対応方法
PHPにて「Fatal error: [] operator not suppo ...
-
-
PHPにて「hashids(Sqids)」ライブラリで数値からユニークなランダム英数字のIDに変換する方法
PHPにてユーザID等を推測されないよう数値のIDからユニークなランダム英数字の ...
-
-
Codeigniter3で外部ファイル(CSS / JS)の読み込みと共通パーツ化する方法
CodeigniterでCSSやJSファイル等の外部ファイル読み込みたかった。ま ...
-
-
PHPにて文字のあいまい検索(文字のゆれ)を実装する方法
Googleで検索する際に、ちょっと間違えて入力してしまっても「もしかして○○? ...