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で画像のフォーマット(拡張子)の変換
画像のアップロードでjpg/png/gif形式を受け付けつつ、 最終的にjpgで ...
-
-
PHP8系で「Warning: Constant xxxxx already defined in」エラーの対応方法
PHP8系&WordPress6.4.3で「Warning: Const ...
-
-
セレクトメニューとテキストエリアの連動
やりたかった事は、 ・セレクトメニューで何れかを選択すると連動したテキストエリア ...
-
-
PHPで「ramsey/uuid」ライブラリを用いてUUIDを生成する方法
PHPでUUID(Universally Unique Identifier)を ...
-
-
phpdotenvライブラリを使用してPHPで.envファイルを読み込ませる方法
CodeIgniterを勉強していた際に各種設定は「.env」というファイルに記 ...