嵌套php三值问题:三值输出!=如果-否则

嵌套php三值问题:三值输出!=如果-否则,php,Php,我相当擅长使用PHP三元运算符。然而,我遇到了一个障碍,试图找出为什么下面的代码与if-else等效结构不匹配。测试在不同的数字上运行了三次。每个结构的输出低于代码 三元: $decimal_places = ($max <= 1) ? 2 : ($max > 3) ? 0 : 1; $decimal\u places=($max 3)?0 : 1; 三值输出: 最大值:-100000十进制:0 最大值:0.48小数点:0 最大值:0.15小数点:0 否则 if($max <

我相当擅长使用PHP三元运算符。然而,我遇到了一个障碍,试图找出为什么下面的代码与if-else等效结构不匹配。测试在不同的数字上运行了三次。每个结构的输出低于代码

三元:

$decimal_places = ($max <= 1) ? 2 : ($max > 3) ? 0 : 1;
$decimal\u places=($max 3)?0 : 1;
三值输出:

最大值:-100000十进制:0

最大值:0.48小数点:0

最大值:0.15小数点:0

否则

if($max <= 1)
 $decimal_places = 2;
elseif($max > 3)
 $decimal_places = 0;
else
 $decimal_places = 1;
if($max 3)
$decimal_places=0;
其他的
$decimal_places=1;
如果有其他输出:

最大值:-100000十进制:2

最大值:0.48小数点:2

最大值:0.15小数点:2


有人能告诉我为什么这两个控件结构不输出相同的数据吗?

代码按如下方式执行

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

因此,只有当右侧三元表达式需要用括号括起来时,才能得到2和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);
$decimal\u places=($max 3)?0 : 1);
//另一种看待它的方式
$decimal_places=($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;
$decimal_places=($max 3))?0 : 1;
//另一种看待它的方式
$decimal_places=($max 3))
? 0
: 1;
将其转换为if-else,即:

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

if ($cond)
    $decimal_places = 0;
else
    $decimal_places = 1;
if($max 3);
如果($cond)
$decimal_places=0;
其他的
$decimal_places=1;

因此,
$decimal\u places
对于
$max
的所有值,除了
2
,最后都是
0
,在这种情况下,它的计算结果是
1

,只要放上括号,您就可以了,如下所示:

 $decimal_places = ($max <= 1) ? 2 : (($max > 3) ? 0 : 1);
$decimal\u places=($max 3)?0 : 1);

正如其他人指出的,使用偏执。
但是,如果您真的想让它可读,那么以下内容如何:

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

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

嵌套三元运算符不是一个好主意的原因之一,您知道,它们不是完全等价的。整个elseif将在三元结构中短路。它们也不是嵌套的:建议避免“堆叠”三元表达式。当在一条语句中使用多个三元运算符时,PHP的行为是不正确的-obvious@MarkBaker我只试着把它们嵌套在非常简单的语句上,因为我见过三元语句,它们让你想做一些暴力的事情。三元运算符的所有用法都让我想做一些暴力的事情。没有什么好的理由添加它们。人类阅读代码的能力远远超过编写代码的能力。使用糟糕的结构(如三元运算符)使其“简洁”,会增加错误并降低可维护性,正如您在问题中看到的那样。确实非常尴尬,但我还是做到了这一点,这很好(因为我在开关等内部有很多控件if语句)
$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'
))));