2009-11-26 51 views
6

我不明白這裏發生了什麼。從邏輯上講,這對我沒有任何意義。PHP CASE聲明不能與ZERO值一起使用

<?php 
$level = 0; 

switch ($level) { 

    case $level > 80: $answer = 'high'; break; 
    case $level > 60: $answer = 'moderate-to-high'; break; 
    case $level > 40: $answer = 'moderate'; break; 
    case $level > 20: $answer = 'low-to-moderate'; break; 
    default: $answer = 'low'; break; 
} 
echo $answer; 
?> 

當$ level == 0時,它返回「高」。這對我來說沒有任何意義。有人可以解釋這裏發生了什麼嗎?

回答

26

更改switch ($level)switch (true),這將工作。

switch語句對案例中的值執行相等性測試。 PHP正在評估您的>比較,因此case $level > 80變爲case falsefalse被認爲等於0,所以第一個案例匹配。

+2

這對我來說很有意義。我在切換作品的方式上有一個根本性的誤解。感謝您的教育! – pbarney 2009-11-26 00:19:50

+0

@pbamey,是的,很好的答案,我同意,所以接受它,並讓菲爾到期。 – Don 2009-11-26 00:39:05

+4

我不確定這是否是使用switch語句的推薦方法,但我不會說它讀得很好。 – 2009-11-26 00:45:55

5

case之後的數量需要只是值,而不是布爾表達式。我猜測PHP正在評估case $level > 80case ($level > 80),它正在變爲case 0(即,假,因爲$level確實不少於80),所以你要匹配第一種情況。

0

你確定你可以在php中做到這一點嗎?

我剛剛檢查了manual of switch,你必須提供一個獨特的價值。

我認爲,如果能再次寫入到類似:

$levelDivTwenty = intval($level/20); 
$levelDivTwenty = ($levelDivTwenty>4)?4:$levelDivTwenty; 

,然後情況上。

switch ($levelDivTwenty) { 
    case 4: //same as $level > 80 before... 
    case 3: //>60 etc... 
} 
1

正如其他人所指出的,你不能使用開關這樣的,但如何將其定義是這樣的:

<? 
$level = 21; 
$answers = array('low', 'low-to-moderate', 
       'moderate', 'moderate-to-high', 'high'); 

echo $answers[intval(($level-1)/20)]; 
?> 

:如果$水平= 0,那麼表達式內intval()將是-1/20,,它小於-1,因此將舍入爲0

+0

這是一個有趣的方法 – pbarney 2009-11-26 02:50:59

1

這實際上並不打算如何使用開關。這是評估一個具體的價值。

如果在這裏使用If/else,而不是讓你的生活複雜化,使一個開關像一個工作。