0

我有以下代码来查看分配的时间是否已经过去。对于我的演示,它应该全部评估为 false,并且什么都不会发生。曾经发生的事情是它解析为真,即使我将它与 >= 进行比较

为什么我会出现这种奇怪的行为?

$data = '[{"ip":"80.61.150.173","endtime":1343988643},{"ip":"80.61.150.173","endtime":1343988649},{"ip":"80.61.150.173","endtime":1343988650},{"ip":"80.61.150.173","endtime":1343988664},{"ip":"80.61.150.173","endtime":1343988682},{"ip":"80.61.150.173","endtime":1343988723}]';
$json = json_decode($data,true);
foreach($json as $key => $obj)
    {
    var_dump($obj);
    echo "<BR>";
    var_dump(time());
    echo "<BR>";
    if($obj['endtime'] <= time());
        {
        echo "<BR>bliep<P>";
        }
    }

此代码计算结果如下:

数组(2){[“ip”]=>字符串(13)“80.61.150.173”[“endtime”]=>int(1343988643)}
int(1343981967)

bliep array(2) { ["ip"]=> string(13) "80.61.150.173" ["endtime"]=> int(1343988649) }
int(1343981967)

哔哔

数组(2){[“ip”]=>字符串(13)“80.61.150.173”[“endtime”]=>int(1343988650)}
int(1343981967)

哔哔

数组(2){[“ip”]=>字符串(13)“80.61.150.173”[“endtime”]=>int(1343988664)}
int(1343981967)

哔哔

数组(2) { ["ip"]=> 字符串(13) "80.61.150.173" ["endtime"]=> int(1343988682) }
int(1343981967)

哔哔

数组(2){[“ip”]=>字符串(13)“80.61.150.173”[“endtime”]=>int(1343988723)}
int(1343981967)

哔哔

正如你所看到的,那里有所有不应该存在的哔哔声。时间戳是整数,当前时间小于保存时间。它应该很容易比较,但它总是评估为真,而现在 < 比存储的时间戳。

这里发生了什么?

这不是我的服务器,因为此代码在http://writecodeonline.com/php/上的计算结果也为 true

4

2 回答 2

3

;如果您的if陈述,我相信最后有一个错字。

应该是

if($obj['endtime'] <= time());

代替

if($obj['endtime'] <= time())
于 2012-08-03T08:27:19.687 回答
1

因为

if($obj['endtime'] <= time());

应该

if($obj['endtime'] <= time())//without the semicolon

尽管您有答案,但我认为很高兴知道为什么它没有引发错误。

本质上if($obj['endtime'] <= time());被解释为的或单行的 if 语句:

if($obj['endtime'] <= time())
    echo 'foo';
else
    echo 'bar';

但是由于语句和分号之间没有语句if,php 将继续执行,并且 - 相当烦人的 IMO - 忽略花括号。我不确定这一点,但如果你else{}在下一行有一个,你可能会得到一个错误......
一个很好的例子,说明对各种语法的支持如何让你头疼。也就是说,我喜欢你的编码风格,在新行上保持打开和关闭卷曲。提高可读性恕我直言。

于 2012-08-03T08:28:25.787 回答