1

这将输出“选项 1”。我不知道它有什么问题。

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

谢谢!

4

5 回答 5

3

您在此处遇到运算符优先级三元运算符的问题。您在括号中的位置会明显看出您缺乏理解。我们来复习:

$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');
                                ^                                ^

这将为您提供预期的结果,即现在按预期的括号控制优先级。


提示:您可以在编写此类语句时使用缩进使决策树更加可见:

$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';

这里只需要一个决定,所以它不那么复杂。如果您有超过三种可能性,则此示例更有意义,但即使对于三种可能性,这已经是一种改进,因为前面可以看到存在默认情况。

于 2012-11-02T17:05:46.490 回答
1

尝试添加第二组分组括号:

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

干杯

于 2012-11-02T16:49:11.153 回答
1

您必须将第二条路径用引号括起来:

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

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

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

于 2012-11-02T16:49:21.093 回答
1

试试这个:

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

输出:

Option 0

于 2012-11-02T16:50:18.827 回答
1

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

? 'Option 1' : 'Option 2';
于 2012-11-02T16:53:36.850 回答