2011-10-31 93 views
2

這是很奇怪的,但下面是我的case語句:案件陳述輸出不正確?

switch($grade){ 
    case ($average >70): 
    $grade = 'A'; 
    break; 
    case ($average >=60 && $average <=69): 
    $grade = 'B'; 
    break; 
    case ($average >=50 && $average <=59): 
    $grade = 'C'; 
    break; 

}; 

所以,如果它的70+是A級,60-69級B,50-59級C.

而是將其輸出這個:60+等級A,50-59等級B,40-49等級C.

爲什麼這樣做是因爲功能看起來正確?

echo "<p><strong>Average Mark:</strong> $average</p>"; 
    echo "<p><strong>Average Grade:</strong> $grade</p>"; 
+2

開關的情況下工作得非常不同於IF-elseif-否則,這是你在這裏要做的。 – BoltClock

+2

比較不同於你開啓的變量可能會導致'SAN'損壞(不要這麼做)。範圍檢查通常以下限包含,上限排他(所以,「$ average> = 60 && $ average <70」)來執行。如果「$ average」是_exactly_70,會發生什麼?你的'默認'情況在哪裏? –

回答

1

的if/else你應該使用 - 聲明:

if($average >70) 
{ 
    $grade = 'A'; 
} else if($average >=60 && $average <=69) 
{ 
    $grade = 'B'; 
} else if($average >=50 && $average <=59) 
{ 
    $grade = 'C'; 
} 
6

正如在評論中提到他人的情況下的「條件」應該是一個靜態值,而不是一個邏輯表達式。

此外,您打開的值(在您的情況下,$grade)應該是您正在測試的值。你似乎正在使用它作爲關於分配的變量的提示。

解決您的代碼將使用if-elseif的-else結構最簡單的方法:

if ($average >70) 
    $grade = 'A'; 
elseif ($average >=60 && $average <=69) 
    $grade = 'B'; 
elseif ($average >=50 && $average <=59) 
    $grade = 'C'; 

然而,要乖張,並說明如何switch語句的作品,你也可以這樣做以下:

switch(true){ 
    case ($average >70): 
     $grade = 'A'; 
     break; 
    case ($average >=60 && $average <=69): 
     $grade = 'B'; 
     break; 
    case ($average >=50 && $average <=59): 
     $grade = 'C'; 
     break; 
}; 

在這個例子中我的值true比較每個依次的情況下,其中每個那些情況下值的實際上是評估一個布爾表達式的結果。值爲true的第一個表達式將觸發。

如果你不懂switch語句,可能沒有太大的幫助。

編輯:我剛剛注意到邏輯中存在一個缺口:如果某人的平均值恰好爲70呢?使用級聯聲明像一個開關或的if-else,可以消除一些冗餘的(在這種情況下損壞)的代碼,從而:

if ($average >=70) 
    $grade = 'A'; 
elseif ($average >=60) 
    $grade = 'B'; 
elseif ($average >=50) 
    $grade = 'C'; 
// ... 
else 
    $grade = 'F'; 

...等,到任何最低級的你」重新使用。

+1

Mayur,你應該看看PHP手冊:http://www.php.net/manual/en/control-structures.switch.php –

2

對於那些你說開關變量你$average你錯了。在這種情況下評估的唯一原因是因爲開關使用寬鬆比較,所以它說$average被設置爲爲真,並將其與條件進行比較,所有這些條件都是真或假。以前,使用未設置的$grade將開關評估爲false,因爲在鬆散比較中,未設置的變量將會發出通知並返回false。

雖然我建議使用IF-THEN-ELSE中,適當答案在這種情況下使用switch語句如下:

switch (true) { 
    case ($average >= 70): 
     $grade = 'A'; 
     break; 
    case ($average >= 60 && $average < 70): 
     $grade = 'B'; 
     break; 
    case ($average >= 50 && $average < 60): 
     $grade = 'C'; 
     break; 
} 

就像上面說的,語句將返回true或錯誤。這個想法是,只有一個語句應該一次返回true,因此switch語句會將它的true值與傳遞並執行該代碼的語句的值相匹配,因爲所有其他語句都是false並且不匹配。

0

編輯:或者,也可以計算出$grade值(50-100在本例中):

$grades = "CBAAA"; 
$grade = $grades[(int)($average/10) - 5]; 

開關循環比較例。如果你真的想用開關的工作(而不是如果/ ELSEIF /人),那麼你就可以用比較反對TRUE切換到它:

switch(TRUE) 
{ 
    case $average > 70: 
     $grade = 'A'; 
     break; 

    case $average >= 60 && $average <= 69: 
     $grade = 'B'; 
     break; 

    case $average >= 50 && $average <= 59: 
     $grade = 'C'; 
     break; 

    default: 
     throw new Exception(sprintf('Unable to map average (%d) to a grade.', $average)); 
}