了解嵌套的 PHP 三元运算符

我不明白输出(“”)是如何产生的?four

$a = 2;

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

// prints 'four'

我不明白为什么“”会被打印出来。four


答案 1

您需要将三元条件括起来:

<?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;
?>

返回:

other
one
two
three
other
four
other

如您所料。

请参阅 PHP 三元运算符帮助中“三元运算符”底部的注释。

正在从左到右计算表达式。所以你实际上得到了:

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

所以对于 ,你会得到:$a=2

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

然后

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

然后

  echo (
    ('two' ? 'three' : $a == 5) ? 'four' : 'other');

然后

  echo (
    'three' ? 'four' : 'other');

等等。echo 'four'

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


答案 2

PHP手册的比较运算符页面上,他们解释说PHP在嵌套(堆叠)三元运算符时的行为是“不明显的”。

您编写的代码如下所示:

$a = 2;

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

// prints 'four'

就像2一样,两者都是TRUE,你得到“”作为结果,因为你不再比较是否为真。$a'two''three'four'four'

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

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

// prints 'two'

推荐