我有以下代码来查看分配的时间是否已经过去。 对于我的演示,它应该全部评估为假,没有任何事情发生。 发生的事情就是它解析为true,即使我将它与> =
进行比较为什么我会遇到这种奇怪的行为?
$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”] =&gt; string(13)“80.61.150.173”[“endtime”] =&gt; int(1343988643)}
int(1343981967)bliep array(2){[“ip”] =&gt; string(13)“80.61.150.173”[“endtime”] =&gt; int(1343988649)}
int(1343981967)bliep
array(2){[“ip”] =&gt; string(13)“80.61.150.173”[“endtime”] =&gt; int(1343988650)}
int(1343981967)bliep
array(2){[“ip”] =&gt; string(13)“80.61.150.173”[“endtime”] =&gt; int(1343988664)}
int(1343981967)bliep
array(2){[“ip”] =&gt; string(13)“80.61.150.173”[“endtime”] =&gt; int(1343988682)}
int(1343981967)bliep
array(2){[“ip”] =&gt; string(13)“80.61.150.173”[“endtime”] =&gt; int(1343988723)}
int(1343981967)bliep
正如你所看到的,那里有所有不应该存在的blieps。 时间戳是整数,当前时间小于节省的时间。 它应该很容易比较,但它总是评估为真,而现在是&lt;而不是存储的时间戳。
这里发生了什么?
这不是我的服务器,因为此代码在http://writecodeonline.com/php/
上的评估结果为true答案 0 :(得分:3)
我相信如果你的;
声明,最后会有一个拼写错误if
。
应该
if($obj['endtime'] <= time());
而不是
if($obj['endtime'] <= time())
答案 1 :(得分:1)
由于
if($obj['endtime'] <= time());
应该是
if($obj['endtime'] <= time())//without the semicolon
虽然你有答案,但我认为很高兴知道为什么它没有抛出错误。
基本上if($obj['endtime'] <= time());
被解释为 short 或单行if语句:
if($obj['endtime'] <= time())
echo 'foo';
else
echo 'bar';
但是由于if
语句和分号之间没有语句,php将继续执行,而且 - 烦人地IMO-忽略大括号。我不确定这一点,但如果你在下一行有一个else{}
,你可能会遇到错误......
一个很好的例子,说明支持各种语法会给你带来如此激烈的头痛。也就是说,我喜欢你的编码风格,在新线上保持打开和关闭卷曲。提高可读性恕我直言。