我非常有能力使用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
有谁能告诉我为什么这两个控制结构不会输出相同的数据?
答案 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'
))));
你当然可以省略最后一对括号,但这会使它看起来不那么规则。