案件陈述输出不正确?
这是很奇怪的,但下面是我的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>";
的if/else你应该使用 - 声明:
if($average >70)
{
$grade = 'A';
} else if($average >=60 && $average <=69)
{
$grade = 'B';
} else if($average >=50 && $average <=59)
{
$grade = 'C';
}
正如在评论中提到他人的情况下的“条件”应该是一个静态值,而不是一个逻辑表达式。
此外,您打开的值(在您的情况下,$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';
...等,到任何最低级的你”重新使用。
Mayur,你应该看看PHP手册:http://www.php.net/manual/en/control-structures.switch.php –
对于那些你说开关变量你$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并且不匹配。
编辑:或者,也可以计算出$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));
}
开关的情况下工作得非常不同于IF-elseif-否则,这是你在这里要做的。 – BoltClock
比较不同于你开启的变量可能会导致'SAN'损坏(不要这么做)。范围检查通常以下限包含,上限排他(所以,“$ average> = 60 && $ average