嵌套的三元运算符输出奇怪的结果

时间:2012-11-02 16:47:53

标签: php operator-keyword ternary

输出'选项1'。我不知道它有什么问题。

$result = (0 == 0) ? 'Option 0' : (1==2) ? 'Option 1' : 'Option 2';

谢谢!

5 个答案:

答案 0 :(得分:3)

此处Operator PrecedenceTernary Operator存在问题。在放置括号的地方,您可以看到缺乏理解。我们来看看:

$result = (0 == 0) ? 'Option 0' : (1 == 2) ? 'Option 1' : 'Option 2';
          ^      ^                ^     ^

我并不是说这很简单,但正如此代码已经显示的那样,您已在此处放置了多余的圆括号。它们只是不需要,这通常是自己代码不确定的标志。正确的变体是:

$result = 0 == 0 ? 'Option 0' : 1 == 2 ? 'Option 1' : 'Option 2';

现在,这已经表明您不确定放置括号的位置。了解这一点,也包含您的问题的解决方案。只需先进行第一次检查,然后再进行第二次检查,将你的弱点转化为力量 - 但这次实际使用了括号:

$result = 0 == 0 ? 'Option 0' : (1 == 2 ? 'Option 1' : 'Option 2');
                                ^                                ^

这将为您提供预期结果,括号控制优先于预期。


提示:在编写此类语句时,可以使用缩进使decision tree更加可见:

$result = 
    0 == 0 ? 'Option 0' 
           : (1 == 2 ? 'Option 1' 
                     : 'Option 2')
;

(或类似)乍一看这是为了让它更具可读性。因为它表明这个一个复杂的决定。与复杂事物一样,为它们编写代码时出错更频繁。这很正常。使用缩进保持代码可读可以提供帮助。另一种方法是降低复杂性。

$decide  = 2:
$results = array(
    0 => 'Option 0', 
    1 => 'Option 1',
);
$result  = isset($results[$decide]) ? $results[$decide] : 'Default Option';

这里只需要做出一个决定,因此不那么复杂。如果你有三种以上的可能性,这个例子更有意义,但即使有三种可能性,这已经是一种改进,因为它在前面是可见的,有一个默认情况。

答案 1 :(得分:1)

尝试添加第二组分组:

$result = (0 == 0) ? 'Option 0' : ((1==2) ? 'Option 1' : 'Option 2');

干杯

答案 2 :(得分:1)

您必须将第二个路径分组为引号:

  $result = (0 == 0)?'Option 0':((1==2)?'Option 1':'Option 2');

顺便说一句:由于这种意外行为,不建议使用嵌套/堆叠三元组。请参阅php文档http://php.net/manual/en/language.operators.comparison.php

  

注意:建议您避免“堆叠”三元表达式。 PHP在单个语句中使用多个三元运算符时的行为是不明显的:

答案 3 :(得分:1)

试试这个:

$result = (0 == 0)? 'Option 0':((1==2) ? 'Option 1' : 'Option 2');

输出:

Option 0

答案 4 :(得分:1)

这与右关联(现在无法找到源)有关 - 首先评估右侧。因此,首先评估这部分:

? 'Option 1' : 'Option 2';