Вот мой код.
$value = 0; switch($value) { case ( $value <= 25 ): $CompScore = 'low'; break; case ($value > 25 && $value <= 50 ): $CompScore = 'fair'; break; case ($value > 50 && $value <= 75 ): $CompScore = 'good'; break; case ($value >75 ): $CompScore = 'excellent'; break; default: $CompScore = 'low'; break; } echo $CompScore;
Когда значение равно 0
, $compScore
fair
. Почему он не показывает low
? Я не понимаю, почему.
Значение, которое вы передаете в оператор switch, в основном состоит в том, что оператор switch ищет оцениваемое соответствие, идущее сверху вниз по списку случаев, пока не найдет одно значение, равное (свободное сравнение), например true == true
.
В вашем примере ваши сравнения оцениваются как booleans (true или false) – $value
переменной $value
равно нулю, что равно false
, но не идентично (строгое сравнение) с false
. Например:
(0 == false) // true (0 === false) // false (1 == false) // false (1 === false) // false (1 == true) // true (1 === true) // false (true === true) // true
Таким образом, используя логическое значение true
качестве значения вашего переключателя, вы можете сделать это, чтобы иметь числовое сравнение внутри оператора, где каждое сравнение будет оцениваться как true
и false
чтобы соответствовать / не соответствовать исходному true
значению (логическое – логическое сравнение).
switch(true) { case ($value <= 25): // true $CompScore = 'low'; break; case ($value > 25 && $value <= 50 ): // false $CompScore = 'fair'; break; case ($value > 50 && $value <= 75 ): // false $CompScore = 'good'; break; case ($value >75 ): // false $CompScore = 'excellent'; break; default: // if you removed the first case $CompScore = 'low'; // this default case would be used break; }
switch
не работает так.
Поскольку $value
0
что является ложным значением.
$value <= 25
true
, $value > 25 && $value <= 50
является false
, поэтому $CompScore
будет 'fair'
.
Для вас используйте код if elseif else
который будет более читаемым.
Вы можете переписать свой код, как показано ниже:
// from excellent to low if ($value > 75) { $CompScore = 'excellent'; } else if ($value > 50) { $CompScore = 'good'; } else if ($value > 25) { $CompScore = 'fair'; } else { $CompScore = 'low'; }
Проблема в том, что вы используете свой переключатель определенным образом.
Ты говоришь :
$value = 0; Switch ($value){ case ($value < 25): .... }
Это, наконец, сравнивает значение $ <25 и 0, как описано ниже:
($value<25) == $value. => true == 0
Это неправильно, потому что true != 0
Способ сделать то, что вы хотите, это просто заменить switch($value)
на switch(true)
чтобы интерпретатор фактически сравнил проверку, если ваши аргументы case истинны.