了解嵌套的PHP三元运算符

Jim*_*mit 17 php ternary-operator operator-precedence

我不明白输出(" four")是怎么来的?

$a = 2;

echo
  $a == 1 ? 'one'   :
  $a == 2 ? 'two'   :
  $a == 3 ? 'three' :
  $a == 5 ? 'four'  : 
    'other'  
  ;

// prints 'four'
Run Code Online (Sandbox Code Playgroud)

我不明白为什么" four"被打印出来.

MGw*_*nne 28

您需要包含三元条件:

<?php

for ($a=0; $a < 7; $a++) {
  echo (
    $a == 1 ? 'one' :
    ($a == 2 ? 'two' :
    ($a == 3 ? 'three' :
    ($a == 5 ? 'four' : 'other'))));
    echo "\n";
    // prints 'four'
}
exit;
?>
Run Code Online (Sandbox Code Playgroud)

收益:

other
one
two
three
other
four
other
Run Code Online (Sandbox Code Playgroud)

正如你所期望的那样.

请参阅PHP Ternary操作员帮助中"三元运算符"底部的注释.

表达式从左到右进行评估.所以你实际上得到了:

  echo (
    ((($a == 1 ? 'one' : $a == 2)
     ? 'two' : $a == 3) ? 'three' :
    $a == 5) ? 'four' : 'other');
Run Code Online (Sandbox Code Playgroud)

所以$a=2,你得到:

  echo (
    ((($a==2) ? 'two' : $a == 3) ? 'three' :
    $a == 5) ? 'four' : 'other');
Run Code Online (Sandbox Code Playgroud)

然后

  echo (
    ((true ? 'two' : $a == 3) ? 'three' :
    $a == 5) ? 'four' : 'other');
Run Code Online (Sandbox Code Playgroud)

然后

  echo (
    ('two' ? 'three' : $a == 5) ? 'four' : 'other');
Run Code Online (Sandbox Code Playgroud)

然后

  echo (
    'three' ? 'four' : 'other');
Run Code Online (Sandbox Code Playgroud)

等等echo 'four'.

请记住,PHP是动态类型的,并将任何非零非空值视为TRUE.

  • 因为==运算符比ternar运算符具有更高的优先级,并且地狱中断了;) (4认同)
  • 与其他语言中的三元运算符相比,这是完全相反的行为,例如:C/C++或Java.即使是JavaScript也是以正确的(预期的)方式完成的.无论如何,如PHP手册中所述,不建议使用嵌套的三元表达式 (3认同)

Sam*_*uel 6

比较运算符 PHP手册页面,他们解释说,PHP的行为是"非显而易见的"嵌套(堆积)三元运营商时.

你写的代码是这样的:

$a = 2;

echo
  ((($a == 1  ? 'one'   :
     $a == 2) ? 'two'   :
     $a == 3) ? 'three' :
     $a == 5) ? 'four'  : 
       'other'
  ;

// prints 'four'
Run Code Online (Sandbox Code Playgroud)

由于$a是2和两个'two''three'是也是如此,你会得到" four"作为结果,如果你没有任何比较长'four'是真还是假.

如果你想改变它,你必须把括号放在不同的地方[也注意:BeingSimpler和MGwynne]:

$a = 2;
echo 
  ($a == 1 ? 'one'   :
  ($a == 2 ? 'two'   :
  ($a == 3 ? 'three' :
  ($a == 5 ? 'four'  : 
     'other'))))
  ;

// prints 'two'
Run Code Online (Sandbox Code Playgroud)