DatePeriodでハマる人がいるらしいので、for文で説明してみた

More than 1 year has passed since last update.

PHPで日付をループする方法と罠のように、プログラミング初心者にはハマりやすい罠らしいです。for文で書き直してみたら多分そんなくだらないハマり方しなくなると思うので、書いておきますね。

コードは、上記の記事のやつを勝手に拝借して、適当に修正してます。

<?php
$start = new DateTime('2016-11-02');
$end = new DateTime('2016-11-08');
$interval = new DateInterval('P2D');

$period = new DatePeriod($start, $interval, $end);

foreach ($period as $date) {
    echo $date->format('Y-m-d').PHP_EOL;
    // $end の "2016-11-08" は出力されない
}

これを for文 で書くと、こんな感じになります。

<?php
$start = new DateTime('2016-11-02');
$end = new DateTime('2016-11-08');
$interval = new DateInterval('P2D');

for ($currentDate = $start; $currentDate < $end; $currentDate->add($interval)){
    echo $currentDate->format('Y-m-d').PHP_EOL;
    // $end が出力されない!!!><
}

$current < $end; って書いてるのに、$endが含まれるわけねーじゃんwww 」と、すぐに気付けます。一目瞭然ですね。

「for文の文2は <= を使うだろ常考www」っていうツッコミを受けそうな気がしましたが、範囲を表す場合は「包含-排他範囲」が基本です。
DatePeriod::__constructの第3引数は$endなので、$end自身を含めないのが一般的な解釈でしょう。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.