这很奇怪,但下面是我的个案陈述:
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>";
答案 0 :(得分: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,该怎么办?使用像switch或if-else这样的级联语句,可以消除一些冗余(在这种情况下是破坏性的)代码,因此:
if ($average >=70)
$grade = 'A';
elseif ($average >=60)
$grade = 'B';
elseif ($average >=50)
$grade = 'C';
// ...
else
$grade = 'F';
...依此类推,无论你使用的是什么最低等级。
答案 1 :(得分:2)
对于那些说切换变量的人$average
,你错了。它在该实例中进行评估的唯一原因是因为switch使用松散比较,所以它说$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或false。这个想法是只有一个语句应该一次返回true,因此switch语句会将它的值true与仅传递和执行该代码的一个语句匹配,因为所有其他语句都是false并且不匹配
答案 2 :(得分:1)
你应该使用if / else - statements:
if($average >70)
{
$grade = 'A';
} else if($average >=60 && $average <=69)
{
$grade = 'B';
} else if($average >=50 && $average <=59)
{
$grade = 'C';
}
答案 3 :(得分:0)
修改:或者您可以计算$grade
值(本例中为50-100):
$grades = "CBAAA";
$grade = $grades[(int)($average/10) - 5];
开关循环比较案例。如果你真的想使用switch作为工作(而不是if / elseif / else),那么你可以使用一个与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));
}