为什么这个时间戳比较总是计算为true


Why does this timestamp comparing always evaluate to true?

我有以下代码来查看分配的时间是否已经过去。对于我的演示,它应该全部评估为false,不应该发生任何事情。发生的事情是,它解析为true,即使在inf中,我也将其与>=进行比较

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

$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>";
        }
    }

此代码评估为以下结果:

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

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

bliep

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

bliep

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

bliep

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

bliep

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

bliep

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

这是怎么回事?

它不是我的服务器,因为此代码在http://writecodeonline.com/php/

如果您的if语句的末尾有一个拼写错误;

应该是

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

而不是

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

因为

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{},你可能会得到一个错误
一个很好的例子说明了如何支持各种语法会让您头疼不已。也就是说,我喜欢你的编码风格,在新行中保持开头和结尾的卷曲。提高可读性IMHO。