Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中连接多个三元运算符?_Php_Ternary Operator - Fatal编程技术网

如何在PHP中连接多个三元运算符?

如何在PHP中连接多个三元运算符?,php,ternary-operator,Php,Ternary Operator,我经常使用三元运算符,但似乎无法将多个三元运算符堆叠在一起 我知道堆叠多个三值运算符将降低代码的可读性,但在某些情况下,我会这样做 我喜欢这样做 这就是我迄今为止所尝试的: $foo = 1; $bar = ( $foo == 1 ) ? "1" : ( $foo == 2 ) ? "2" : "other"; echo $bar; // display 2 instead of 1 正确的语法是什么?在每个内部三元运算符周围加括号,这样可以确保运算符优先级: $bar = ( $foo ==

我经常使用三元运算符,但似乎无法将多个三元运算符堆叠在一起

我知道堆叠多个三值运算符将降低代码的可读性,但在某些情况下,我会这样做 我喜欢这样做

这就是我迄今为止所尝试的:

$foo = 1;
$bar = ( $foo == 1 ) ? "1" : ( $foo == 2 ) ? "2" : "other";
echo $bar; // display 2 instead of 1

正确的语法是什么?

在每个内部三元运算符周围加括号,这样可以确保运算符优先级:

$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");

这些括号就是我想让你明白的

试一试

添加括号:

$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");

你可以这样写:

$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other");
(即:只需在括号中嵌入“内部”三元运算符。)

然而,我真的很想不这么做,因为它的可读性就像一个被严重弄脏的特别难以辨认的东西一样-从来没有任何借口可以混淆代码,这几乎就是它的边界。

问题是,与所有其他语言不同,PHP使条件运算符左关联。这会破坏您的代码——在其他语言中也可以

您需要使用括号:

$bar = $foo == 1 ? "1" : ($foo == 2 ? "2" : "other");

(请注意,我已从代码中删除了其他括号;但这些括号是正确的,只是多余的。)

您需要在右侧操作数周围添加一些括号:

$foo = 1;
$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");
echo $bar;
PHP的解释器已损坏,并处理您的行:

$bar = ( $foo == 1 ) ? "1" : ( $foo == 2 ) ? "2" : "other";
作为


由于左侧表达式的计算结果为“true”,因此将返回剩余三元运算符(“2”)的第一个操作数。

只需将括号叠起来,即可得到:

$bar = ($foo==1? "1" : ($foo==2? "2" : "other"));
作为一个旁白,如果你有很多子句,你应该考虑使用<代码>开关<代码>:

switch ( $bar ) {
  case 1:  echo "1";
  case 2:  echo "2";
  default: echo "other";
}
如果开关变长,可以将其包装在函数中

$foo = 1;
$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");
echo $bar;

只需使用extra()就可以了

“注意,我已经从代码中删除了其他括号;但是这些括号是正确的,只是多余的”-但是对于这样的解析器,您永远无法确定…;-)-1个坏了?解析器的行为完全符合PHPs运算符优先级和关联性概述的定义:@nikic PHP的手册记录了实现-文档没有定义实现,因为PHP从来没有正式的规范。与其他所有支持三元运算符的语言相比,实现是不完整的(即不同的)。如果你想说它与你习惯的语言不同,为什么不说它呢?@nikic我说的正是我想说的。任何明智的语言“设计”都会遵循C、C++、java等的先例。
switch ( $bar ) {
  case 1:  echo "1";
  case 2:  echo "2";
  default: echo "other";
}
$foo = 1;
$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");
echo $bar;