Коммутатор не работает с числовыми случаями сравнения

Вот мой код.

$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 ? Я не понимаю, почему.

Related of "Коммутатор не работает с числовыми случаями сравнения"

Значение, которое вы передаете в оператор 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 истинны.