这里有一些玩笑和令人误解的评论,甚至答案中的部分错误信息。我想尝试改善它们:
首先,正如某些人指出的那样,您的代码中存在一个与问题相关的错误:
if ($status = 'clear' AND $pRent == 0)
应该是(请注意==
而不是=
第一部分):
if ($status == 'clear' AND $pRent == 0)
这在这种情况下,在功能上等同于
if ($status == 'clear' && $pRent == 0)
其次,请注意,这些运算符(and or && ||
)是短路运算符。这意味着,如果可以从第一个表达式确定确定答案,则永远不会评估第二个表达式。同样,这与上面的调试行无关紧要,但是在将这些运算符与赋值结合使用时,这非常重要,因为
第三,and or
和之间的真正区别在于&& ||
它们的运算符优先级。尤其重要的是,&& ||
优先级比赋值运算符(= += -= *= **= /= .= %= &= |= ^= <<= >>=
)高,而优先级比赋值运算符and or
低。因此,在结合使用赋值和逻辑评估的陈述中,选择哪个陈述很重要。
PHP页面上有关逻辑运算符的修改示例:
$e = false || true;
将评估为,true
并将该值分配给$e
,因为||
其运算符优先级高于=
,因此它的评估本质上是这样的:
$e = (false || true);
然而
$e = false or true;
将分配false
给$e
(然后执行该or
操作并求值true
),因为它=
具有比更高的运算符优先级or
,本质上是这样评估的:
($e = false) or true;
这种歧义甚至存在的事实使很多程序员总是使用它&& ||
,然后一切都可以像使用C之类的语言那样清晰地工作。逻辑运算,然后分配。
诸如Perl之类的某些语言经常使用类似于以下格式的这种构造:
$connection = database_connect($parameters) or die("Unable to connect to DB.");
从理论上讲,这会将数据库连接分配给$connection
,或者如果连接失败(并且我们在这里假设函数将返回false
在这种情况下求值的值),它将以错误消息结束脚本。由于短路,如果数据库连接成功,die()
则永远不会评估。
一些允许这种构造的语言会在条件/逻辑语句中(例如Python)直接禁止分配,以反过来消除模糊性。
PHP允许同时使用这两种方法,因此您只需要学习一下两个选项,然后按照自己的意愿进行编码,但希望您会以一种或另一种方式保持一致。
如有疑问,只需添加一组括号即可消除所有歧义。这些将始终是相同的:
$e = (false || true);
$e = (false or true);
拥有所有这些知识,我更喜欢使用,and or
因为我认为它使代码更具可读性。我只是有一条规则,不要将分配与逻辑评估结合在一起。但是在那一点上,这只是一种偏爱,而一致性在这里比选择哪一方更为重要。
$items_list = array(2,177);
$rules_list = array( '[(13 OR 3 OR 2 )]', '[(54 OR 77 ) AND 17 AND 59 AND 36 ] OR [(2 AND 36 )]', '[(2 OR 3 OR 13 ) AND 30 ]', '[(2 )] OR [(13 OR 4 ) AND (17 )]', '[(2 )] OR [(13 OR 3 ) AND 17 ]', '[(2 AND 30 ) OR (3 AND 30 )]', );
//计算使用所提供的项目每个规则的布尔结果array`