2009-11-26 12 views
6

No entiendo lo que está sucediendo aquí. Lógicamente, no tiene ningún sentido para mí.Sentencia PHP CASE no funciona con valores CERO

<?php 
$level = 0; 

switch ($level) { 

    case $level > 80: $answer = 'high'; break; 
    case $level > 60: $answer = 'moderate-to-high'; break; 
    case $level > 40: $answer = 'moderate'; break; 
    case $level > 20: $answer = 'low-to-moderate'; break; 
    default: $answer = 'low'; break; 
} 
echo $answer; 
?> 

Cuando $ level == 0, devuelve "high". Esto no tiene ningún sentido para mí. ¿Alguien puede explicar lo que está sucediendo aquí?

Respuesta

26

Cambie switch ($level) a switch (true) y esto funcionará.

switch declaraciones realizan pruebas de igualdad en los valores en los casos. PHP está evaluando sus comparaciones >, por lo que case $level > 80 se convierte en case false. false se considera igual a 0, por lo que el primer caso coincide.

+2

Esto tiene tanto sentido para mí ahora. Tuve un malentendido fundamental en el funcionamiento del interruptor. Gracias por la educación! – pbarney

+0

@pbamey, sí, buena respuesta, estoy de acuerdo, así que acéptalo y dale a Phil su merecido. – Don

+4

No estoy seguro de si este sería el enfoque recomendado de usar una instrucción switch, sin embargo, no diría que se lee muy bien. –

5

La cantidad después del case debe ser solo el valor, no una expresión booleana. Supongo que PHP está evaluando case $level > 80 como case ($level > 80) que se está convirtiendo en case 0 (es decir, falso, ya que $level es de hecho NO inferior a 80) y por lo tanto está haciendo coincidir el primer caso.

0

¿Estás seguro de que puedes hacer esto en php?

Acabo de comprobar el manual of switch y debe proporcionar un valor distinto.

creo que si se puede escribir de nuevo en algo así como:

$levelDivTwenty = intval($level/20); 
$levelDivTwenty = ($levelDivTwenty>4)?4:$levelDivTwenty; 

y luego en caso de que.

switch ($levelDivTwenty) { 
    case 4: //same as $level > 80 before... 
    case 3: //>60 etc... 
} 
1

Como otros han señalado que no se puede utilizar el interruptor así, pero ¿qué hay de lo define así:

<? 
$level = 21; 
$answers = array('low', 'low-to-moderate', 
       'moderate', 'moderate-to-high', 'high'); 

echo $answers[intval(($level-1)/20)]; 
?> 

Nota: Si el nivel de $ = 0, luego la expresión dentro de intval() será -1/20, que es menor que -1 y, por lo tanto, se redondeará a 0.

+0

que es un enfoque interesante – pbarney

1

Este no es realmente el sentido de uso del interruptor. Es para evaluar un valor específico.

Usa un If/else aquí, en lugar de complicar tu vida para hacer que un interruptor funcione como tal.

Cuestiones relacionadas