这里的一些答案存在玩笑、误导性评论,甚至是部分不正确的信息。我想尝试改进它们:
首先,就像一些人指出的那样,你的代码存在与问题相关的错误:
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
由于 =
运算符的优先级高于 or
运算符,所以将会把 false
赋值给 $e
(然后执行 or
运算并计算出 true
), 实际上的运算过程如下:
($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 )]', );
//使用提供的项目数组计算每个规则的布尔结果 - Bhargav Patel