Это очень странно, но ниже мое заявление:
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+ это класс А, 60-69 класс В, 50-59 класс С.
Но вместо этого он выводит это: 60 + класс A, 50-59 класс B, 40-49 класс C.
Почему это делается, потому что функция кажется правильной?
echo "<p><strong>Average Mark:</strong> $average</p>"; echo "<p><strong>Average Grade:</strong> $grade</p>";
Как упоминалось в комментариях, «условие» в случае должно быть статическим значением, а не логическим выражением.
Кроме того, значение, которое вы включаете (в вашем случае, $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
с каждым из случаев в свою очередь, где каждый из этих значений case фактически является результатом оценки булевского выражения. Первое выражение, значение которого соответствует true
будет срабатывать.
Наверное, не очень помогает, если вы не понимаете операторов switch.
Редактирование : я только заметил, что в логике есть пробел: что, если чья-то средняя составляет ровно 70? Используя каскадный оператор, такой как переключатель или if-else, вы можете устранить часть избыточного (и в этом случае повреждающего) кода, таким образом:
if ($average >=70) $grade = 'A'; elseif ($average >=60) $grade = 'B'; elseif ($average >=50) $grade = 'C'; // ... else $grade = 'F';
… и т. д., к любому низкому классу, который вы используете.
Для тех из вас, кто говорит, что переменная переменная $average
, вы ошибаетесь . Единственная причина, по которой он оценивается в этом случае, заключается в том, что коммутатор использует свободное сравнение , поэтому он говорит, что значение $average
установлено true и сравнивает его с условными выражениями, все из которых будут либо истинными, либо ложными. Раньше использование $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. Идея заключается в том, что только один оператор должен когда-либо возвращать истину за один раз, поэтому оператор switch будет соответствовать его значению true для одного оператора, который передал и выполнил только этот код, поскольку все остальные являются ложными и не совпадают ,
Вы должны использовать if / else – statements:
if($average >70) { $grade = 'A'; } else if($average >=60 && $average <=69) { $grade = 'B'; } else if($average >=50 && $average <=59) { $grade = 'C'; }
Изменить: альтернативно вы можете вычислить значение $grade
(50-100 в этом примере):
$grades = "CBAAA"; $grade = $grades[(int)($average/10) - 5];
Цикл переключателя сравнивает случаи. Если вы действительно хотите использовать переключатель для задания (а не 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)); }
,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)); }