2011-06-01 51 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; 

只需使用額外的(),它會工作的