php - tiempo - problema con el interruptor condicional
ejemplo codigo angular (6)
El siguiente ejemplo es un extráct de http://php.net/manual/de/control-structures.switch.php
<?php
$totaltime = 0;
switch ($totaltime) {
case ($totaltime < 1):
echo "That was fast!";
break;
case ($totaltime > 1):
echo "Not fast!";
break;
case ($totaltime > 10):
echo "That''s slooooow";
break;
}
?>
Esperaba el resultado como "Eso fue rápido". Pero el resultado real es "¡No rápido!". Sería genial si alguien me puede explicar por qué?
Pero si agrego otro caso, case 0: echo "That was super fast!".
Entonces está haciendo un eco apropiado. es decir, "¡eso fue súper rápido!". Por favor, ayúdame a usar la declaración de cambio condicional.
EDITAR:-
Gracias a todos por sus respuestas. Puedo superar el problema anterior modificando el interruptor ($ totaltime) para cambiar (1)
Casi parece que este es un problema de conversión.
La primera declaración de caso evaluará a cualquier otra cosa que no sea 0, por lo que no se golpeará.
Pero la segunda declaración de caso evaluará a falso, que debe ser 0, que es igual a lo que ha establecido $ totaltime.
No utiliza condicionales en las declaraciones de case
como ese, no intuitivamente de todos modos. Esto es lo que está pasando:
case ($totaltime < 1): // Evaluates to 1. $totaltime is not 1, so no match.
case ($totaltime > 1): // Evaluates to 0. $totaltime is 0, so match.
Esencialmente estás tratando de usar un constructo else if
como una construcción de switch
, pero la funcionalidad no está ahí. Los condicionales no se evalúan de la manera que se espera (como lo harían en un bloque if
), solo buscan el primer bloque de case
que es igual al valor que se prueba en el bloque de switch
.
Otros han mencionado por qué ocurre esto (uso incorrecto de un condicional en el enunciado de caso), pero no han ofrecido alternativas. Switch está destinado a cubrir argumentos específicos como {0, 1, 2, 3..100, 101}, etc. Separa los argumentos o rangos específicos en lugar de realizar un simple if / else (como lo has usado). Sin embargo, puede reescribir sus argumentos para lograrlo:
switch ($totaltime) {
case (0):
echo "That was fast!";
break;
case (1..PHP_INT_MAX):
echo "Not fast!";
break;
default:
echo "That''s slooooow";
break;
}
Aquí el .. permite cubrir un rango, por lo que cualquier cosa desde 1 hasta entero máximo está cubierta por ese caso. El 0 se maneja de forma explícita y todos los demás (re: <0) están cubiertos por el caso por defecto.
Suerte,
El cambio de PHP es el mismo que la serie de declaraciones IF. Los casos se evalúan como:
if($totaltime == ($totaltime < 1)) {
echo "That was fast!";
break;
}
if($totaltime == ($totaltime > 1)) {
echo "Not fast!";
break;
}
...
Claramente 0 == falso para 2nd IF es verdadero y de ahí el resultado.
Gracias, Vikas.
case ($totaltime < 1):
significa 1
a PHP (esa ecuación devuelve verdadero)
case ($totaltime > 1):
significa 0
a PHP (esa ecuación devuelve false)
Como $totaltime
es 0, obtienes esa salida
En otras palabras, PHP compara $totaltime
con el resultado de las comparaciones.
EDIT con respecto a EDIT en OP:
Debe deshacerse de la declaración de switch()
. Solo lo usa para comparar fácilmente con diferentes valores y no usar expresiones adicionales con él.
Me refiero a lo que está mal con
<?php
$totaltime = 0;
if ($totaltime < 1) {
echo "That was fast!";
} else if ($totaltime > 10) {
echo "That''s slooooow";
} else if ($totaltime > 1) {
echo "Not fast!";
}
?>
EDITAR: tenga en cuenta que cambié las dos últimas declaraciones if para que realmente funcione.
Odio necro una publicación que ya está respondida, pero estoy bastante desconcertado, nadie tocó el método de cambio (verdadero).
No hay ventaja de velocidad en el mundo real de ninguno de los métodos
En algunos casos, el cambio fue más rápido, otros si fue más rápido, pero solo en fracciones de un microsegundo (48,16 μs frente a 49,11 μs cambian más rápido que si).
EDITAR
Y ahora veo que OP hizo lo mismo ...
<?php
for ( $totaltime = 0; $totaltime < 11; $totaltime += 0.5 ) {
switch ( true ) {
case ( $totaltime < 1 ):
echo $totaltime . " That was fast!/n";
break;
case ( $totaltime < 10 ):
echo $totaltime . " Not fast!/n";
break;
default:
echo $totaltime . " That''s slooooow/n";
break;
}
}
Resultados: https://3v4l.org/d71lZ
0 That was fast!
0.5 That was fast!
1 Not fast!
1.5 Not fast!
2 Not fast!
2.5 Not fast!
3 Not fast!
3.5 Not fast!
4 Not fast!
4.5 Not fast!
5 Not fast!
5.5 Not fast!
6 Not fast!
6.5 Not fast!
7 Not fast!
7.5 Not fast!
8 Not fast!
8.5 Not fast!
9 Not fast!
9.5 Not fast!
10 That''s slooooow
10.5 That''s slooooow