这将输出“选项 1”。我不知道它有什么问题。
$result = (0 == 0) ? 'Option 0' : (1==2) ? 'Option 1' : 'Option 2';
谢谢!
这将输出“选项 1”。我不知道它有什么问题。
$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');
^ ^
这将为您提供预期的结果,即现在按预期的括号控制优先级。
提示:您可以在编写此类语句时使用缩进使决策树更加可见:
$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';
这里只需要一个决定,所以它不那么复杂。如果您有超过三种可能性,则此示例更有意义,但即使对于三种可能性,这已经是一种改进,因为前面可以看到存在默认情况。
尝试添加第二组分组括号:
$result = (0 == 0) ? 'Option 0' : ((1==2) ? 'Option 1' : 'Option 2');
干杯
您必须将第二条路径用引号括起来:
$result = (0 == 0)?'Option 0':((1==2)?'Option 1':'Option 2');
顺便说一句:由于这种意外行为,不建议使用嵌套/堆叠三元。请参阅 php 文档http://php.net/manual/en/language.operators.comparison.php
注意:建议您避免“堆叠”三元表达式。在单个语句中使用多个三元运算符时 PHP 的行为并不明显:
试试这个:
$result = (0 == 0)? 'Option 0':((1==2) ? 'Option 1' : 'Option 2');
输出:
Option 0
这与它是右关联的(现在找不到源)有关 - 首先评估右侧。因此,首先评估这部分:
? 'Option 1' : 'Option 2';