所以今天,我每天都在编程。继续我惯常的工作,打字,听Daft Punk和各种其他时髦的曲调。然后,我不得不写下以下内容:
$x = 'a'; // For instance
if ($x == 'a' || $x == 'b') {
// ...
}
很简单,我说的不是太破旧。可是等等!我心想"there must be an easier way to do that - I'm repeating myself"
。所以我开始尝试用以下代码解决这个问题:
if ($x == ('a' || 'b')) {
// ...
}
然而,这不起作用。完全没有。它总是是真的。如果$x
等于a
,b
,c
或cake
。所以我生气了,哭了一下,决定问Stackoverflow你们有没有人知道为什么。
谢谢!
答案 0 :(得分:2)
||
是逻辑或者,它将左侧评估为布尔值('a'
,它位于布尔上下文true
中),如果该值为true则返回true,否则返回true对于右手边也一样。
var_dump('a' || 'b');
bool(true)
现在,将此值与一个字符进行比较,根据PHP的疯狂规则(loose comparison chart),该字符也将为真:
var_dump('a' == true);
bool(true)
答案 1 :(得分:1)
您要求PHP评估$x
是否等于('a' OR 'b')
的值,这将始终返回true
,因为'a'和'b'都具有非零值。
在这种情况下,您必须单独使用比较运算符,或者从评论中使用nickb的建议。
答案 2 :(得分:1)
它没有用,因为
$a = 'a' || 'b'; // true, since 'a' and 'b' considered truthy
在这种情况下,您的字符串文字将为converted to booleans.
如果if中的$x
不是空字符串或其他字符串被认为是假的,那么它们将是相同的。
但是你可以写下你的if:
if (in_array($x, array('a', 'b', 'cake'))
如果你觉得它让你的意图更清晰。
答案 3 :(得分:1)
我愿意:
$valid = array('a', 'b');
if (in_array($x, $valid)) {
...
}
够简单!
......但是,回想起来,也许你不想要另一种方式去做?
答案 4 :(得分:1)
如你所知||是一个逻辑运算符,并始终返回true或false(在另一个单词1或0中)。 所以,代码('a'||'b')总是返回true(1)。在上面这种情况下,$ x包含值,因此由于自动类型会话,$ x也设置为true(1)所以它的if(1 == 1)并且返回始终为true。
尝试使用以下代码
$x = false;
if ($x == ('a' || 'b')) { echo 'true'; } else{ echo 'false';}
始终返回false。
答案 5 :(得分:0)
了解php如何将字符串转换为布尔值
php > var_dump((bool) "a");
bool(true)
php > var_dump((bool) "b");
bool(true)
php > var_dump((bool) "cake");
bool(true)
所以基本上你问php if($ x == true)
答案 6 :(得分:0)