2012-07-30 79 views
4

所以今天,我每天都在编程。按照我平常的生意,打字,听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,ccake。所以我生气了,哭了一下,决定问Stackoverflow,如果你们中的任何人都知道为什么。

谢谢!

+0

可能的重复[是否PHP支持连接和本机分离?](http://stackoverflow.com/questions/9065182/does-php-support-conjunction-and-disjunction-natively) – 2012-07-30 18:28:40

+2

我觉得'('a '||'b')'将始终为真,因为'a'和'b'是非零值,因此评估为一/真。 – 2012-07-30 18:28:40

+0

评估为真 – 2012-07-30 18:29:17

回答

1

您要求PHP评估$x是否等于('a' OR 'b')的值,因为'a'和'b'都具有非零值,所以总是返回true

在这种情况下,您必须单独使用比较运算符,或者从注释中使用nickb的建议。

1

它没有工作,因为

$a = 'a' || 'b'; // true, since 'a' and 'b' considered truthy 

在这种情况下,您的字符串字面量将converted to booleans.

如果你的$x中,如果不是一个空字符串或其他字符串falsy他们会考虑等于。

然而,你可以写你的,如果是这样的:

if (in_array($x, array('a', 'b', 'cake')) 

如果你觉得它使你的意图更加清晰。

2

||是合乎逻辑的,或者它会评估左侧布尔('a',这是在布尔上下文true),如果这是真的返回true,如果没有,它做同样的事情换右手边。

var_dump('a' || 'b'); 
bool(true) 

现在,这个值将与性格,这基于PHP的疯狂规则(loose comparison chart)相比,也将是如此:

var_dump('a' == true); 
bool(true) 
+0

和最有趣的所有,'(“字符串”== 0)=>真“ – Adi 2012-07-30 18:35:48

0

查看如何PHP将字符串转换为布尔

php > var_dump((bool) "a"); 
bool(true) 
php > var_dump((bool) "b"); 
bool(true) 
php > var_dump((bool) "cake"); 
bool(true) 

所以基本上你问的PHP如果($ X ==真)

1

我会做:

$valid = array('a', 'b'); 

if (in_array($x, $valid)) { 
    ... 
} 

够简单了!

......但是,回想起来,也许你不想另有办法做到这一点?

+0

伟大的,但这不是问题 – 2012-07-30 18:34:44

+0

+1,因为它不仅回答了问题,但它也提供了一种替代解决方案。 – Matt 2012-07-30 18:37:28

+0

是的,我注意到了。太晚了。也许我必须再次学习英语:我只做了八年。 – Viktor 2012-07-30 18:37:48

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。