2011-04-02 43 views
1

我有這樣的:PHP速記問題

$color = $status == 1 || $status == 2 ? 'read' : 'unread' || $status == 3 ? 'delete' : 'unread'; 

然而這是錯誤的。如果$status不是3 - 它仍然返回'刪除'

有什麼問題?我應該使用else if而不是簡寫嗎?

謝謝。

回答

6

你想得到什麼結果?我假設你想:

  1. 閱讀
  2. 刪除
  3. $顏色=($狀態== 1)? 'read': ($ status == 3)? '刪除': '未讀'

(這是出於某種原因,沒有顯示我的換行符)

爲了增強可讀性,但是,我會使用任何if/elseswitch

switch ($status) { 
    case 1: $color = 'read'; break; 
    case 3: $color = 'delete'; break; 
    default: $color = 'unread'; 
} 

一般情況下,我不使用'?:'形式,除非我會獲得巨大的改進;通常,更可讀性更好。

+0

我從來沒有在PHP中使用開關。我將收回我對我的回答'$ color = $ status == 1 ||的評論$ status == 2? 'read':('unread'|| $ status == 3?'delete':'unread');'並且因爲您的權利而進入開關。 – Kyle 2011-04-02 22:02:54

3

1)||不是100%等於或諸如& &不是100%等於與
2)使用括號

P.S:是的,用「如果...否則」 - 它會增加代碼的可讀性。

+0

感謝我有括號 – Kyle 2011-04-02 22:01:20

+0

解決它,你可以在你的第一個點擴大? – 2011-04-02 22:03:33

+0

當然:&&和||比AND和OR具有更高的優先級。 http://www.php.net/manual/en/language.operators.php#43111 – Chvanikoff 2011-04-02 22:09:56

1

我會說不要這樣做的簡寫 - 在你忘記自己在做什麼或者其他人出現的三天時間裏,longhand會更容易閱讀。

0

固定括號謝謝Chvanikoff。

$color = ($status == 1 || $status == 2) ? 'read' : ('unread' || $status == 3 ? 'delete' : ''); 
1

三元運算符具有古怪的綁定。

而且你可以使用地圖來代替:

$map = array(0=>"unread", 1=>"unread", 2=>"read", 3=>"delete"); 

$color = $map[ min(3,$status) ]; // min is actually the max value here 
+0

你的數組$ map:如果「未讀」只是自己坐的,這意味着什麼? – Kyle 2011-04-02 22:22:08

+0

@凱爾:對不起。第一個條目佔據'[0]'索引。這是另一個回退。如果您確定$狀態不能爲零,那麼您可以將其忽略。在其他情況下,最好注意所有潛在的價值。我會忽略所有'123 =>'說明符,並將其作爲一個列表。 OTOH更準確地列出它們的可讀性。 - 如果$ status肯定在0到3之間,那麼你也可以省略'min()'hack,這比switch語句更加簡潔。 – mario 2011-04-02 23:07:45