2013-03-28 88 views
0

我發現一些奇怪......, 我有這樣一段代碼在我的函數的末尾:短if語句

return $class == 3?"red":$class==2?"orange":$class==1?"yellow":""; 

現在,當$class == 2這將返回「黃」,而不是「橙色」像我預料的那樣。 有人可以向我解釋這個嗎?

+1

其在PHP ternory運營商這是equivallent到如果else語句 – 2013-03-28 08:50:12

+0

它是一個錯字,還是真正的代碼?缺少'$' - 在最後一堂'課堂'前面的標誌? – 2013-03-28 08:50:18

+1

請RTFM:http://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary – deceze 2013-03-28 08:51:39

回答

3

由於三元運算符在PHP中是左關聯的,因此您需要使用括號。關聯性是如何「運營商相同的優先級在沒有括號分組」 - 從Operator Associativity

$class == 3?"red":($class ==2?"orange":($class ==1?"yellow":"")); 
+0

我解決了它與一個數組︰$ colors =陣列( 「」, 「黃」, 「橙」, 「紅色」);返回$ colors [$ class]; – 2013-03-28 08:59:02

+0

很好地完成;這是一個更好的方法:-) – andyb 2013-03-28 09:01:55

+0

我只是想知道爲什麼它不工作,沒有一個不同的方法。你和@Voitcus給了我正確的答案。 – 2013-03-28 09:07:13

1

我絕不會喜歡的代碼吧。我相信,當你編碼時,你真的想立即看到一段代碼在做什麼。這不會做,這只是讓你頭疼;-)

也許改變它的東西明確:

switch($class) { 
    case 1: 
     return 'yellow'; 

    case 2: 
     return 'orange'; 

    case 3: 
     return 'red'; 

    default: 
     return ''; 
} 
0

使用括號:

$class = 2; 
echo $class == 3?"red":($class==2?"orange":($class==1?"yellow":"")); 

輸出:orange

2

這是因爲它是這樣對待的:

return (($class == 3?"red":$class==2)?"orange":$class==1)?"yellow":""; 

所以加上括號來強制使用權:

return $class == 3?"red":($class==2?"orange":($class==1?"yellow":"")); 
+0

+1我剛剛添加到我的答案 – andyb 2013-03-28 08:58:33