2014-03-06 27 views
3

這是我的代碼。開關不適用於數字比較案例

$value = 0; 
switch($value) { 
     case ($value <= 25): 
      $CompScore = 'low'; 
      break; 
     case ($value > 25 && $value <= 50): 
      $CompScore = 'fair'; 
      break; 
     case ($value > 50 && $value <= 75): 
      $CompScore = 'good'; 
      break; 
     case ($value >75): 
      $CompScore = 'excellent'; 
      break; 
     default: 
      $CompScore = 'low'; 
      break; 
} 

echo $CompScore; 

當值是0$compScorefair。爲什麼它不顯示low?我不明白爲什麼。

回答

0

您傳遞到switch語句的值基本上是switch語句查找所評估匹配的值,從上到下從案例列表開始,直到它找到一個爲等於(鬆散比較),例如true == true

在您的例子,你的comparisons被評估爲布爾值(真或假) - 你的可變$value被設置到零,這是等於false,但不相同(嚴格比較)至false。例如:

(0 == false) // true 
(0 === false) // false 
(1 == false) // false 
(1 === false) // false 
(1 == true)  // true 
(1 === true) // false 
(true === true) // true 

因此,通過使用一個布爾true爲你的開關值,你可以做到這一點有數字比較的聲明,其中每個比較將取值爲truefalse內匹配/不匹配原始的true值(布爾 - 布爾比較)。

switch(true) { 
     case ($value <= 25):     // true 
      $CompScore = 'low'; 
      break; 
     case ($value > 25 && $value <= 50): // false 
      $CompScore = 'fair'; 
      break; 
     case ($value > 50 && $value <= 75): // false 
      $CompScore = 'good'; 
      break; 
     case ($value >75):     // false 
      $CompScore = 'excellent'; 
      break; 
     default:        // if you removed the first case 
      $CompScore = 'low';   // this default case would be used 
      break;       
} 
+0

想到這個問題是「爲什麼它不顯示低?」 –

+0

示例顯示爲低。爲什麼這會被投票?如果合理,將刪除。 –

+0

你不解釋爲什麼它不能與原始代碼一起工作。 –

2

switch不能這樣工作。

由於$value0這是falsy值。

$value <= 25true$value > 25 && $value <= 50false,所以$CompScore'fair'

對於您的代碼,使用if elseif else流量將會更具可讀性。

你可以重寫代碼象下面這樣:

// from excellent to low 
if ($value > 75) { 
    $CompScore = 'excellent'; 
} else if ($value > 50) { 
    $CompScore = 'good'; 
} else if ($value > 25) { 
    $CompScore = 'fair'; 
} else { 
    $CompScore = 'low'; 
} 
1

的問題是,你在一個特定的方式使用您的開關。

你是在說:

$value = 0; 
Switch ($value){ 
    case ($value < 25): 
     .... 

} 

下面所描述的這最後比較$值< 25和0:

($value<25) == $value. 
=> true == 0 

這是錯誤的,因爲true != 0

辦法做什麼你想用這種方法只是簡單地用switch(true)替換switch($value),這樣翻譯實際上會比較檢查是否喲你的個案陳述是真實的。