输出'选项1'。我不知道它有什么问题。
$result = (0 == 0) ? 'Option 0' : (1==2) ? 'Option 1' : 'Option 2';
谢谢!
答案 0 :(得分:3)
此处Operator Precedence和Ternary 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';