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を使っていきたいところ。
関連記事
-
-
SortableJSを使ってデータの並べ替え&保存
あるシステムを拝見した際にtableタグ内に並んでいる項目をドラッグ&ド ...
-
-
PHPとSQLiteで簡易BBSの作成
PHPとSQLiteの練習で簡易掲示板を作ったのでメモ。 目次1 ...
-
-
PHPで複数の画像やテキストファイルをzipファイルとしてダウンロードさせる方法
PHPで画像ファイルやテキストファイルをzip圧縮して、ダウンロードさせたかった ...
-
-
地理院のジオコーディングAPIをPHPからリクエストする方法
以前に地理院のジオコーディングAPIをjavascriptからajaxでリクエス ...
-
-
PHPで配列じゃないものに対してソート
PHP Warning: sort() expects parameter 1 ...