2011-10-17 95 views
1

有可能對案例進行邏輯控制嗎?PHP開關和案例邏輯控制

即:

$v = 0; 
$s = 1; 

switch($v) 
{ 
    case $s < $v: 
     // Do some operation 
     break; 
    case $s > $v: 
     // Do some other operation 
     break; 
} 

有沒有辦法做同樣的事情?

+1

爲什麼要使用開關?改用if-else梯子。 – Dev

+0

用於較簡單的代碼。在當前代碼中使用wsitch對我來說更容易 –

+0

爲什麼不嘗試它並親自查看? –

回答

1

不是最易讀的用法,但是可以。

使用if/else - if/elseif/else結構如果您確實需要一個簡單的比較。

+0

非常感謝Gianps –

2

這不起作用,每個案例都需要是標量值。在你的例子中,它甚至更糟糕,它可能似乎工作,但...

$ s < $ v的計算結果爲false,這會觸發$ v,因爲它在這裏是0。

+0

非常感謝Kris! :) –

4

傳遞給切換的條件是所述箱子來比較的值。條件(在你的問題$ v中)被評估一次,然後PHP尋找匹配結果的第一個情況。

From the manual(後實施例#2),加上強調:

switch語句執行由線(實際上,由語句語句)線。一開始,沒有代碼被執行。 僅當發現一個case語句的值與switch表達式的值匹配時,PHP纔開始執行語句。 PHP繼續執行語句,直到切換塊結束,或者第一次看到break語句。

在你的問題switch ($v)是一樣的,如果你寫:switch (0),因爲$v = 0。然後,你的交換機將試圖找到它等於0的情況下,而且,正如@Kris said

$ S < $ V評估爲假,這在$ V觸發,因爲它在這裏是0。


如果必須使用case語句的條件,您的開關狀態應該是一個布爾值,例如:

$v = 0; 
$s = 1; 

switch (true) { 
    case ($s < $v): 
     echo 's is smaller than v'; 
    break; 

    case ($s > $v): 
     echo 's is bigger than v'; 
    break; 
} 

現在你的交換機試圖尋求計算結果爲true第一案,在這種情況下將是$s > $v


注意的是,雖然開關條件只計算一次,案件分別以評估:

$a = 1; 

switch ($a) { 
    case 2: 
     echo 'two'; 
     break; 
    case (++$a > 2): 
     break; 
    default: 
     echo $a; 
} 

回波從默認情況下「2」,因爲比較$一個「2時「$ a是1,案件被丟棄;同時:

$a = 1; 

switch ($a) { 
    case (++$a > 2): 
     break; 
    case 2: 
     echo 'two'; 
     break; 

    default: 
     echo $a; 
} 

回聲 '兩節' 從案例 '2',因爲++$a > 2增加$ A,但不匹配$一個。

default是一個後備,它的位置並不重要。

注意:前面提到的開關非常富有且深奧,只是作爲一個例證。