勉強したことのメモ

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

  関連記事

phpdotenvライブラリを使用してPHPで.envファイルを読み込ませる方法

CodeIgniterを勉強していた際に各種設定は「.env」というファイルに記 ...

PHPにて同一サーバの別ディレクトリでセッションを振り分ける方法

同じサーバ内にmemberとownerの別ディレクトリがあり、それぞれにsess ...

PHPからWebAPI(screendot)経由で他サイトのスクリーンショットを取得する方法

PHPで他サイトのスクリーンショットを取得したい。今回はライブラリは無しで実現し ...

フォルダにリンク制限をかける

imgというフォルダがあり、直接URLを叩いても 中身を見られないけど、同一サー ...

PHPでCSVファイルを出力する際に「①」や「㈱」等の環境依存文字が文字化けする対応方法

過去記事の方法を用いてPHPでCSVファイルを出力すると所々「?」という形に文字 ...