switch

(PHP 4, PHP 5, PHP 7)

La sentencia switch es similar a una serie de sentencias IF en la misma expresión. En muchas ocasiones, es posible que se quiera comparar la misma variable (o expresión) con muchos valores diferentes, y ejecutar una parte de código distinta dependiendo de a que valor es igual. Para esto es exactamente la expresión switch.

Nota: Cabe señalar que a diferencia de algunos otros lenguajes, la sentencia continue se aplica a switch y actúa de manera similar a break. Si se tiene un switch dentro de un bucle y se desea continuar a la siguiente iteración de del ciclo exterior, se utiliza continue 2.

Nota:

Tener en cuenta que switch/case hace comparaciones flexibles.

Historial de cambios
Versión Descripción
7.0.0 Múltiples casos predeterminados (default) emitirán un error de tipo E_COMPILE_ERROR.

Los dos ejemplos siguientes son dos formas diferentes de escribir lo mismo, uno con una serie de sentencias if y elseif, y el otro usando la sentencia switch:

Ejemplo #1 Estructura switch

<?php
if ($i == 0) {
    echo 
"i es igual a 0";
} elseif (
$i == 1) {
    echo 
"i es igual a 1";
} elseif (
$i == 2) {
    echo 
"i es igual a 2";
}

switch (
$i) {
    case 
0:
        echo 
"i es igual a 0";
        break;
    case 
1:
        echo 
"i es igual a 1";
        break;
    case 
2:
        echo 
"i es igual a 2";
        break;
}
?>

Ejemplo #2 Estrutura switch permite el uso de strings

<?php
switch ($i) {
    case 
"manzana":
        echo 
"i es una manzana";
        break;
    case 
"barra":
        echo 
"i es una barra";
        break;
    case 
"pastel":
        echo 
"i es un pastel";
        break;
}
?>

Es importante entender cómo la sentencia switch es ejecutada con el fin de evitar errores. La sentencia switch ejecuta línea por línea (en realidad, sentencia por sentencia). Al principio, ningún código es ejecutado. Solo cuando se encuentra una sentencia case cuya expresión se evalúa a un valor que coincida con el valor de la con un valor que coincide con el valor de la expresión switch, PHP comienza a ejecutar la sentencias. PHP continúa ejecutando las sentencias hasta el final del bloque switch, o hasta la primera vez que vea una sentencia break. Si no se escribe una sentencia break al final de la lista de sentencias de un caso, PHP seguirá ejecutando las sentencias del caso siguiente. Por ejemplo:

<?php
switch ($i) {
    case 
0:
        echo 
"i es igual a 0";
    case 
1:
        echo 
"i es igual a 1";
    case 
2:
        echo 
"i es igual a 2";
}
?>

Aquí, si $i es igual a 0, PHP ejecutaría todas las sentencias echo! Si $i es igual a 1, PHP ejecutaría las últimas dos sentencias echo. Se obtendría el comportamiento esperado (se mostraría 'i es igual a 2') sólo si $i es igual a 2. Por lo tanto, es importante no olvidar las sentencias break (aunque es posible que se desee evitar proporcionarlas a propósito bajo determinadas circunstancias).

En una sentencia switch, la condición es evaluada sólo una vez y el resultado es comparado con cada una de las sentencias case. En una sentencia elseif, la condición es evaluada otra vez. Si la condición es más complicada que una simple comparación y/o está en un bucle estrecho, un switch puede ser más rápido.

La lista de sentencias para un caso también puede estar vacía, lo cual simplemente pasa el control a la lista de sentencias para el siguiente caso.

<?php
switch ($i) {
    case 
0:
    case 
1:
    case 
2:
        echo 
"i es menor que 3 pero no negativo";
        break;
    case 
3:
        echo 
"i es 3";
}
?>

Un caso especial es el default. Este caso coincide con cualquier cosa que no se haya correspondido por los otros casos. Por ejemplo:

<?php
switch ($i) {
    case 
0:
        echo 
"i es igual a 0";
        break;
    case 
1:
        echo 
"i es igual a 1";
        break;
    case 
2:
        echo 
"i es igual a 2";
        break;
    default:
       echo 
"i no es igual a 0, 1 ni 2";
}
?>

La sintaxis alternativa para las estructuras de control es compatible con los switch. Para obtener más información, consulte Sintaxis alternativa de estructuras de control.

<?php
switch ($i):
    case 
0:
        echo 
"i es igual a 0";
        break;
    case 
1:
        echo 
"i es igual a 1";
        break;
    case 
2:
        echo 
"i es igual a 2";
        break;
    default:
        echo 
"i no es igual a 0, 1 ni 2";
endswitch;
?>

Es posible utilizar un punto y coma en lugar de dos puntos después de un caso como:

<?php
switch($beer)
{
    case 
'tuborg';
    case 
'carlsberg';
    case 
'heineken';
        echo 
'Buena elección';
    break;
    default;
        echo 
'Por favor haga una nueva selección...';
    break;
}
?>