Php for循环解释

时间:2015-05-28 02:41:56

标签: php

我知道要在Php中显示两个日期之间的日期,我们可以使用此代码

$tsDateFrom = date('2015-05-01');
$tsDateTo = date('2015-05-07');
for($i=$tsDateFrom;$i<=$tsDateTo;$i++) {
   echo $thisDate = $i."<br>" ;
}

显示器

2015-05-01
2015-05-02
2015-05-03
2015-05-04
2015-05-05
2015-05-06
2015-05-07

但是这个怎么样?

$tsDateFrom1 = date('2015-05-01');
$tsDateTo1 = date('2015-05-07');
for($i=$tsDateFrom1;$i<=$tsDateTo1;$i = strtotime('+1 day', $i)) {
  echo $thisDate = $i."<br>";
}

显示

2015-05-01

我需要解释,因为我不熟悉php,我想学习循环是如何工作的。为什么第二个循环只返回第一个日期?

3 个答案:

答案 0 :(得分:1)

首先,您没有正确使用date()

$d = date('2015-05-01');

这将根据您的模式格式化当前日期/时间,例如"Y-m-d",但由于缺少那些格式说明符,它只会返回您传递的内容,即字符串。

其次,strtotime()期望第二个参数是时间戳,而不是字符串;当提供非数字字符串时,它会抱怨并返回你可能没想到的东西:

$ var_dump(strtotime('+1 day', '2015-05-07'));
PHP Notice:  A non well formed numeric value encountered in php shell code on line 1
int(88415)

如您所见,它也不返回字符串,而是返回表示时间戳的整数值。

你可以这样写:

$d = date('Y-m-d', strtotime("$d +1 day"));

但是,在这种情况下,最好使用DatePeriod代替:

$tsDateFrom = new DateTime('2015-05-01 00:00:00');
$tsDateTo = new DateTime('2015-05-07 23:59:59');

foreach (new DatePeriod($tsDateFrom, new DateInterval('P1D'), $tsDateTo) as $date) {
        echo $date->format('Y-m-d'), '<br>';
}

答案 1 :(得分:0)

$i = strtotime('+1 day', $i)返回一个整数,在$i<=$tsDateTo1中无法比较。

也许$i=date('m-d-Y',strtotime($i. "+1 days"));可行。

您可以查看PHP - add 1 day to date format mm-dd-yyyy ....它可能有用

答案 2 :(得分:0)

来自PHP文档:

int strtotime ( string $time [, int $now = time() ] )
     

该函数需要一个包含英文日期的字符串   格式并将尝试将该格式解析为Unix时间戳(   自1970年1月1日00:00:00 UTC以来的秒数,相对于   现在给出的时间戳,或者现在没有提供当前时间。

所以,例如:

echo(strtotime("+1 day"));

输出:

1432868203

然后,如您所见strtotime()并不会以您期望的格式返回某些内容,因为您正在使用yy-mm-dd。

实际上,strtotime('+1 day', $i)在您的代码中引发了错误,并且因为您的循环失败了。

两个建议:

  1. 阅读文档
  2. 打开PHP错误报告,这会告诉您错误的位置。