勉強したことのメモ

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で「ramsey/uuid」ライブラリを用いてUUIDを生成する方法

PHPでUUID(Universally Unique Identifier)を ...

PHPでjpg / png画像をWebP画像に変換し保存する方法

PHPでjpg / png画像を圧縮したかった。ただjpg / pngのままだと ...

CodeIgniter4でのメール送信方法(テキスト・HTMLメール)

CodeIgniter4.4.4でテキストメール及びHTMLメールを送信したい。 ...

PHPの配列でキーの最大値を取得

PHPの配列でキーの最大値を取得したかった。以下で対応する。 $test = a ...

PHP8系の環境でdBug.phpライブラリが使用できない場合の対応方法

先日メモしたdBug.phpをPHP8系の環境で試すと動作しなかった。ただエラー ...