2012-09-30 79 views
2

我在php開關的情況下有問題。php switch語句錯誤int = 0

當我設置$數= 0它應該運行的第一個情況下但在這裏,這個代碼返回10-20K這是第二種情況。

我查了比較操作,如果在其他情況下,他們回到正確的價值觀對它們進行測試,但在這裏第一種情況下不要$數= 0

這究竟是爲什麼跑? PHP認爲0爲代碼錯誤或錯誤?

鏈接到鍵盤粘貼http://codepad.org/2glDh39K

也在這裏是代碼

<?php 

$number = 0; 

    switch ($number) { 
    case ($number <= 10000): 
      echo "0-10K"; 
      break; 
     case ($number > 10000 && $number <= 20000): 
      echo "10-20K"; 
      break; 
     case ($number > 20000 && $number <= 30000): 
      echo "20-30K"; 
      break; 
     case ($number > 30000 && $number <= 40000): 
      echo "30-40K"; 
      break; 
     case ($number > 40000 && $number <= 50000): 
      echo "40-50K"; 
      break; 
     case ($number > 50000 && $number <= 60000): 
      echo "50-60K"; 
      break; 
     case ($number > 60000 && $number <= 70000): 
      echo "60-70K"; 
      break; 
     case ($number > 70000 && $number <= 80000): 
      echo "70-80K"; 
      break; 
     case ($number > 80000 && $number <= 90000): 
      echo "80-90K"; 
      break; 
     case ($number > 90000): 
      echo "90K+"; 
      break; 

     default: //default 
      echo "N/A"; 
      break; 
} 

?> 

回答

4
switch ($number) { 
case ($number <= 10000): // check $number == ($number <= 10000) 
     echo "0-10K"; 
     break; 
// you hit the below because `0 == false` is true in php 
case ($number > 10000 && $number <= 20000): // check $number == ($number > 10000 && $number <= 20000) 
     echo "10-20K"; 
     break; 
// ... 

但是你可以用更少的代碼做:

function showRange($number) { 
    if ($number > 90000) { 
     echo "90K+"; 
     return; 
    } 
    echo sprintf("%s-%sK", (int) ($number/10000) * 10, ((int) ($number/10000) +1) * 10); 
} 
+0

太感謝你了...大回答... –

+0

@JagdeepSingh不客氣:) – xdazz

+0

更簡單嗎?看起來不像我。較少的代碼 - 是的,但可讀性受到影響。 – Lix

2

當你執行一個開關的方法的情況下,你不能對陣這樣的一個布爾值。您只需比較結果值。

我認爲你應該重寫你的代碼來使用if...then...elseif語句。

if ($number <= 10000){ 
    echo "0-10K"; 
}elseif($number <= 20000){ 
    echo "10-20K"; 
}elseif($number <= 30000){ 
    echo "20-30K"; 
}elseif($number <= 40000){ 
    ... 
} 

通過使用這種方法,你不必讓每一次兩次檢查,因爲以前if語句檢查這些條件也是如此。 IE:如果您達到第二個if聲明,則您已知道值爲而不是小於(或等於)1000因此它必須必須大於10000

4

你是差不多使用switch相反,但不完全。您需要可以完全走向反面寫switch(true)

switch (true) { // IMPORTANT CHANGE HERE! 
    case ($number <= 10000): 
     echo "0-10K"; 
     break; 
    case ($number > 10000 && $number <= 20000): 
     echo "10-20K"; 
     break; 
    // etc 
} 

或以其他方式改變整個事情if/else

if ($number <= 10000) { 
    echo "0-10K"; 
else if ($number > 10000 && $number <= 20000) { 
    echo "10-20K"; 
} 
// etc 

兩個重要注意事項:

  1. 反向switch通常第一次看到它時,看起來非常不直觀。如果您覺得不舒服,請不要使用它。
  2. 您的條件可以簡化 - 假設它們按順序出現,每個$number > X零件由於前一個條件($number <= X)中的檢查已失敗而變得多餘。但是,可以認爲,保持這些檢查使得代碼在修改時更加穩健。
+0

正是我一直在尋找...謝謝:) –

1

這裏,如果$ i等於0,PHP將執行所有的print語句!

所以其執行下一個case的聲明,在這種情況下有折斷等出從中

所以使用的if-else-如果不是開關情況下

if ($number <= 10000){ 
    echo "0-10K"; 
}elseif( $number <= 20000){ 
    echo "10-20K"; 
}elseif( $number <= 30000){ 
    echo "20-30K"; 
}elseif( $number <= 40000){ 
    echo "90K+"; 
} 

... 

elseif( $number <= 90000) 
    echo "80-90K"; 

}elseif($number > 90000){ 
echo "90K+"; 
} 
+0

很難理解你在這裏說什麼...... – Lix

+0

這些額外的測試沒有必要。如果我們已經達到了第二個if語句,我們已經知道該值大於10000 ... – Lix

+0

@Lix是的,你是對的 –

1

是的,PHP 0FALSE(除非您使用===)。是的,你的代碼是不正確的 - switch不適用於比較範圍 - 它用於比較值(至少在PHP中,在Ruby或Perl 6中是另一回事),就像那樣。

switch ($letter) { 
case 'a': 
    echo "A?"; 
    break; 
default: 
    echo "Unknown letter"; 
    break; 
} 

在你的情況,你比較數的條件 - 那些要麼返回truefalse。由於0false,第二個條件捕獲。 switch是不是爲這樣的代碼,我會使用ifelse而不是重寫你的邏輯 - 重複是不好的主意。

$range_number = floor($number/1000); 
echo $range_number, $range_number ? "K" : "", "-", $range_number + 1, "K"; 

(順便說一下,我知道switch (true)作品,但不使用它 - 這是醜陋的黑客)

0

你真的不能做,如果一系列number.Use的切換情況下( ){}其他{}爲此目的。

3
$number = 0; 
var_dump($number); // int(0) 

如果您修改語句爲case ($number > 0 && $number <= 10000):,它奇怪地工作。但它適用於任何查找($number > 9091 && $number <= 10000)輸入。

即使與下面的完整bollock:

$number = 0; 
$jonskeet = false; 

switch ($number) 
{ 
    case ($jonskeet === true && $number <= 10000): 
     echo "0-10K"; 
     // ... 

它將輸出​​即使在if聲明相同的條件下將無法正常工作。

問題是select不適用於長條件。如果變量的值等於後面的case關鍵字,則可以使用select做些事情。請參閱:

select ($user_rank) 
{ 
    case 0: 
     return "guest"; 
     break; 
    case 1: 
     return "user"; 
     break; 
    // ... 
    default: 
     return "unknown"; 
     break; 
} 

但是,您在代碼的case s中有很長的條件。

case ($number <= 10000): 
    echo "0-10K"; 
    break; 
case ($number > 10000 && $number <= 20000): 
    echo "10-20K"; 
    break; 

運行此先轉化$number <= 10000TRUE$number > 10000 && $number <= 20000FALSE,像兩個語句。而在此之後,你的代碼是在下面的方式執行:

case TRUE: 
    echo "0-10K"; 
    break; 
case FALSE: 
    echo "10-20K"; 
    break; 

$number0,但它可以evaulate到FALSE過,這就是爲什麼你會得到不期望的輸出。

作爲一個解決方案,您應該翻譯你的代碼有一個if - elseif - else設置:

if ($number < 10000) { 
    echo "0-10K"; 
} else if ($number > 10000 && $number <= 20000) { 
    echo "10-20K"; 
// ... 
} else { 
    echo "N/A"; 
}