嵌套php三值问题:三值输出!=如果-否则
我相当擅长使用PHP三元运算符。然而,我遇到了一个障碍,试图找出为什么下面的代码与if-else等效结构不匹配。测试在不同的数字上运行了三次。每个结构的输出低于代码 三元:嵌套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 <
$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'
))));