2011-06-01 120 views
12

我使用三元运算符很多,但我似乎无法将多个三元运算符堆叠在一起。如何在PHP中连接多个三元运算符?

我知道,堆叠多个三元运算符将使代码更不可读但在某些情况下,我会 喜欢做到这一点。

这是我到目前为止已经试过:

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

什么是正确的语法?各地各内三元操作

+0

可能重复[嵌套PHP三元麻烦:三元输出=如果 - 否则(http://stackoverflow.com/questions/4807454/nested -php-ternary-trouble-ternary-output-if-else) – 2011-06-01 15:05:23

+0

大家都很好回答。 – Cybrix 2011-06-01 15:22:49

回答

17

这些括号是什么,我认为是让你。

尝试

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

认沽括号,这样操作者优先保证:

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

添加括号:

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

你可以正确因此这样写:

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

(即:简单地嵌入在括号中的 '内部' 三元运算符)

但是,我真的会真的不想做这件事,因为它的可读性非常可疑,而且已经被严重污染了 - 从来没有任何理由混淆代码,并且与此相关。

16

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

你需要使用括号:

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

(请注意,我已经移除代码其它括号,但这些都是正确的,只是冗余)

+1

“_Notice我已经从你的代码中删除了其他括号;但是这些都是正确的,只是冗余_” - 但是用这样的解析器,你永远无法确定... ;-) – Alnitak 2011-06-01 15:06:43

8

你需要周围的一些括号手操作:

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

PHP解释器坏了,处理您行:

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

作为

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

并自该左手表达式评估为“真”的剩余三元运算符的第一操作数(“2”)代替返回。

+0

-1破碎?解析器的行为与PHP运算符优先级和关联性概述的定义完全相同:http://php.net/manual/en/language.operators.precedence.php – NikiC 2011-06-01 15:24:55

+2

@nikic PHP的手册记录了实现 - 文档不_define_实现,因为PHP从来没有正式的规范。与支持三元运算符的每种其他语言相比,实现被破坏(即不同)。 – Alnitak 2011-06-01 16:16:47

+0

如果你的意思是说它和你习惯的不一样,那么为什么不这样说呢? – NikiC 2011-06-01 17:05:59

2

刚堆起来的括号,你知道了:

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

顺便说一句,如果你有很多条款,你应该考虑使用switch

switch ($bar) { 
    case 1: echo "1"; 
    case 2: echo "2"; 
    default: echo "other"; 
} 

如果开关变长,可以将其封装在一个函数中。

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

只需使用额外的(),它会工作的