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を使っていきたいところ。
関連記事
-
-
MySQLとPHPの「image-comparator」ライブラリを使用して類似画像検索を実装する方法
先日PHPで画像を比較して類似度を算出する「image-comparator」ラ ...
-
-
PHPでExcelシートを出力する方法(PhpSpreadsheet)
PHPでエクセルシートを出力させたい。以前はPHPExcelを利用していたが現在 ...
-
-
PHP8系からは文字列検索はstrposよりstr_containsが良さそう
PHP8.0のアップデートに関する記事を読んでいたところstr_contains ...
-
-
フォームからアップロードした画像にPHPでロゴ画像(透かし)を追加する方法
フォームから送られてきた画像に対してサイトロゴみたいなロゴ画像を右下等、指定の位 ...
-
-
Codeigniter4で外部ファイル(CSS / JS)の読み込みと共通パーツ化する方法
Codeigniter4.4.4でCSS及びJavaScriptファイルを設置し ...