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

Cyb*_*rix 15 php ternary-operator

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

我知道堆叠多个三元运算符会使代码的可读性降低,但在某些情况下我想这样做.

这是我到目前为止所尝试的:

$foo = 1;
$bar = ( $foo == 1 ) ? "1" : ( $foo == 2 ) ? "2" : "other";
echo $bar; // display 2 instead of 1
Run Code Online (Sandbox Code Playgroud)

什么是正确的语法?

Bra*_*ley 29

那些括号是我认为给你的.

尝试

$foo = 1;
$bar = ($foo == 1) ? "1" : (($foo == 2)  ? "2" : "other");
echo $bar;
Run Code Online (Sandbox Code Playgroud)


Kon*_*lph 18

问题是PHP 与所有其他语言不同,它使条件运算符保持关联.这会打破你的代码 - 这在其他语言中会很好.

你需要使用括号:

$bar = $foo == 1 ? "1" : ($foo == 2 ? "2" : "other");
Run Code Online (Sandbox Code Playgroud)

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


Aln*_*tak 8

你需要周围的一些括号右侧的操作数:

$foo = 1;
$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");
echo $bar;
Run Code Online (Sandbox Code Playgroud)

PHP的解释器坏了,处理你的行:

$bar = ( $foo == 1 ) ? "1" : ( $foo == 2 ) ? "2" : "other";
Run Code Online (Sandbox Code Playgroud)

$bar = (( $foo == 1) ? "1" : ( $foo == 2)) ? "2" : "other";
Run Code Online (Sandbox Code Playgroud)

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

  • @nikic我说的正是我的意思.任何理智的语言"设计"都将遵循由C,C++,Java等设置的先例. (4认同)
  • @nikic PHP的手册记录了实现 - 文档没有_define_实现,因为PHP从未有过正式的规范.与支持三元运算符的其他语言相比,实现被打破(即不同). (2认同)

fak*_*ken 5

在每个内部三元运算符两边加上括号,这样可以保证运算符的优先级:

$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");
Run Code Online (Sandbox Code Playgroud)