2012-06-09 93 views
4

我有一个白痴问题,但我卡住了。php是/ switch语句检查'0'字符串或'00'字符串

这里是我的简单代码

$my_string = '00'; 

switch ((string)$my_string) 
{ 
    case '-1': $return_string = 'bla bla..'; break; 
    case '0': $return_string = 'One zero'; break; 
    case '00': $return_string = 'Double zero'; break; 
    default: $return_string = 'default'; break; 
} 

echo $return_string; 

回报

One Zero 

任何建议之前的代码的结果?

+1

这是在PHP的错误很常见的来源。可能更令人惊讶的事实是,“(”0xFF“== 255)=> True” – jedwards

+1

“如果您将数字与字符串进行比较或者比较涉及数字字符串,则将每个字符串转换为数字,这些规则也适用于switch语句,当比较结果为===或!==时,类型转换不会发生,因为这涉及比较类型和值。 - [PHP的规格](http://php.net/manual/en/language.operators.comparison.php) – jedwards

回答

4

switch使用equality,而不是身份。由于'0'等于'00'(因为它们都评估为0),该结构将不起作用。

+0

感谢您的帖子, – AkisC

+0

有没有eny的方式来检查?我已经尝试了switch和if语句,但结果是相同的 – AkisC

+2

停止使用相等。这是行不通的。 –

1

如上所述:开关不检查相同的类型和值(=====之间的差异)。为了得到一个开关,你的工作的情况下,你可以这样做:

$my_string = '00'; 
switch (true) 
{ 
    case ((string) $my_string === '-1'): $return_string = 'bla bla..'; break; 
    case ((string) $my_string === '0'): $return_string = 'One zero'; break; 
    case ((string) $my_string === '00'): $return_string = 'Double zero'; break; 
    default: $return_string = 'default'; break; 
} 
+0

这是非常钝的,它可能会更易读,只需使用'if'子句就可以了。就可读性而言,我同意 –

+0

。但是由于我不知道OP究竟在做什么,所以我不会提出'如果'分支,因为'switch'具有下降的好处(我认为这是一个好处,至少),而在处理10个以上的案例时,它显着提高了可读性,IMO。即使在这种情况下。我必须承认,事先将'$ my_string'转换为字符串会更易读。 –

0

另一种解决方案是:

switch ('_'.$my_string) 
{ 
    case '_-1': $return_string = 'bla bla..' ; break; 
    case '_0' : $return_string = 'One zero' ; break; 
    case '_00': $return_string = 'Double zero'; break; 
    default : $return_string = 'default' ; break; 
} 
相关问题