嵌套的php三元麻烦:三元输出!= if - else

时间:2011-01-26 17:01:26

标签: php

我非常有能力使用PHP三元运算符。然而,我试图弄清楚为什么下面的代码与if-else等效结构不匹配时遇到了障碍。测试在不同的数字上运行三次。每个结构的输出都在代码之下。

三元:

$decimal_places = ($max <= 1) ? 2 : ($max > 3) ? 0 : 1;

三元输出:

  

max:-100000 decimal:0

     

max:0.48十进制:0

     

最大值:0.15十进制:0

如果-ELSE

if($max <= 1)
 $decimal_places = 2;
elseif($max > 3)
 $decimal_places = 0;
else
 $decimal_places = 1;

If-Else输出:

  

max:-100000 decimal:2

     

最大值:0.48十进制:2

     

最大值:0.15十进制:2

有谁能告诉我为什么这两个控制结构不会输出相同的数据?

4 个答案:

答案 0 :(得分:18)

您的右侧三元表达式需要包含在括号中,因此它将作为单个表达式进行自我评估:

$decimal_places = ($max <= 1) ? 2 : (($max > 3) ? 0 : 1);

// Another way of looking at it
$decimal_places = ($max <= 1)
                ? 2
                : (($max > 3) ? 0 : 1);

否则,您的三元表达式从左到右进行评估,结果为:

$decimal_places = (($max <= 1) ? 2 : ($max > 3)) ? 0 : 1;

// Another way of looking at it
$decimal_places = (($max <= 1) ? 2 : ($max > 3))
                ? 0
                : 1;

其中,翻译成if-else,变成了这个:

if ($max <= 1)
    $cond = 2;
else
    $cond = ($max > 3);

if ($cond)
    $decimal_places = 0;
else
    $decimal_places = 1;

因此除$decimal_places之外的0的所有值$max 2最终为1,在这种情况下,其评估为{{1}}。

答案 1 :(得分:2)

代码以

执行
$decimal_places = (($max <= 1) ? 2 : ($max > 3)) ? 0 : 1;

因此,只有在1 < $max <=3时才会获得2和1。这是因为条件运算符是left-associative。解决方案:放置括号以确保所需的顺序编码:

$decimal_places = ($max <= 1) ? 2 : (($max > 3) ? 0 : 1);

答案 2 :(得分:1)

只要加上括号,就可以了,就像这样:

 $decimal_places = ($max <= 1) ? 2 : (($max > 3) ? 0 : 1);

答案 3 :(得分:1)

正如其他人所指出的,使用paranthesis 但是,如果你真的想让它变得可读,那么:

$decimal_places =
  ($max <= 1) ? 2 : (
  ($max > 3)  ? 0 : (
  1
));

这仍然看起来非常尴尬,但这种尴尬有一个规律的形状,所以它更容易生活。

$drink = 'wine';
return
  ($drink === 'wine')   ? 'vinyard' : (
  ($drink === 'beer')   ? 'brewery' : (
  ($drink === 'juice')  ? 'apple tree' : (
  ($drink === 'coffee') ? 'coffeebeans' : (
  'other'
))));

你当然可以省略最后一对括号,但这会使它看起来不那么规则。