Desarrollo

Estructuras de control SWITCH y DO WHILE

Desarrollo PHP

Vamos a hacer un pequeño paréntesis después de todos los artículos relacionados con funciones, formularios y antes de comenzar a abordar el tema del manejo de ficheros y que podéis consultar en el índice de contenidos. Dedicaremos, pues, algunos artículos a hablar de alguna funcionalidad útil y/o necesaria de PHP y programación en general y a ver algunos conceptos sencillos que podemos ir necesitando de vez en cuando. Por ello, en este artículo volveremos a controlar el flujo de instrucciones y veremos las estructuras de control SWITCH y DO WHILE.

¿Por qué no hemos visto antes estas estructuras de control? Sencillamente porque se puede vivir sin ellas, pero pueden ser útiles cuando los conozcamos y en situaciones concretas.

Un pequeño ejemplo – múltiples IF

Vamos a imaginar que tenemos un programa que simula el lanzamiento de un dado y que, dependiendo del número obtenido mediante la función predefinida rand entre 1 y 6, realice una serie de instrucciones (que no vamos a desarrollar y las dejamos marcadas con un comentario) u otras, lo que indicamos fácilmente con nuestras estructuras de control IF y ELSE. Construyamos fácilmente este programa:

<?php

$lanzamiento = rand(1, 6);

if ($lanzamiento === 1) {
	// ... Aquí van las instrucciones
} elseif ($lanzamiento === 2) {
	// ... Aquí van las instrucciones
} elseif ($lanzamiento === 3) {
	// ... Aquí van las instrucciones
} elseif ($lanzamiento === 4) {
	// ... Aquí van las instrucciones
} elseif ($lanzamiento === 5) {
	// ... Aquí van las instrucciones
} elseif ($lanzamiento === 6) {
	// ... Aquí van las instrucciones
} else {
	echo 'Ha ocurrido un error';
}

?>

Hemos puesto un ELSE final porque, aunque en teoría la función rand debería darnos valores entre 1 y 6 siempre, imaginemos que ocurra un error.

Como vemos, hemos añadido un IF y luego un ELSEIF, y luego otro, y otro, y otro más y aún más hasta el final. Cada vez comparando de nuevo el valor de $lanzamiento con el número correspondiente. Imaginad que la condición fuera más compleja, o imaginad que el dado es de 12 caras, o de 24, o de muchas más. Venga a colocar IF y más ELSEIF.

La estructura de control SWITCH

Existe una estructura de control presente en numerosos lenguajes de programación, llamada SWITCH, que mejora la legibilidad de una estructura de este tipo. En esencia va a hacer lo mismo que hace esa anidación de IF y ELSEIF, pero a ojos del programador será más sencilla de ver y nos da un aspecto más de que, en realidad, estamos tomando una elección sencilla en base a un número de resultado amplio. Y también mejor por una cosa más que luego comentamos. Vamos a ver la misma estructura pero con esta nueva forma:

<?php

$lanzamiento = rand(1, 6);

switch ($lanzamiento) {
	case 1:
		# ... Aquí van las instrucciones
		break;
	case 2:
		# ... Aquí van las instrucciones
		break;
	case 3:
		# ... Aquí van las instrucciones
		break;
	case 4:
		# ... Aquí van las instrucciones
		break;
	case 5:
		# ... Aquí van las instrucciones
		break;
	case 6:
		# ... Aquí van las instrucciones
		break;
	default:
		echo 'Ha ocurrido un error';
		break;
}

?>

La explicación de esta estructura es sencilla. Inicialmente escribimos la palabra reservada switch y luego, entre paréntesis, la variable que queremos evaluar, en este caso $lanzamiento. A partir de ahí entra la otra palabra reservada, case, para establecer caso por caso, lo que se debe hacer.

Así pues, tenemos que en el caso donde el valor sea 1, haga ciertas instrucciones. En el caso donde sea 2, haga otras. Y así hasta el final donde hemos colocado un caso default o por defecto, por si no entra en ninguno de los casos anteriores. Fijáos, además, que después de definir el case se acaba con dos puntos y no hay llaves de ningún tipo excepto para el propio SWITCH (aunque se pueden utilizar también los dos puntos y terminar con ENDSWITCH).

No hay que olvidarse del break

Es completamente necesario en esta estructura colocar una sentencia break al final cada uno de los casos. Esto es así porque, si no lo colocamos, esta estructura ejecutaría todas las instrucciones que hay por debajo del case encontrado. Por tanto, si por ejemplo $lanzamiento tiene valor 2, ejecutaría las instrucciones del case 2 pero también las del 3, las del 4, las del 5, las del 6 y las de default. Es un pequeño detalle que muchas veces se olvida.

¿Por qué no seguir con la anidación de IF?

Viendo que, además, hemos escrito más líneas de código por culpa del break y que tampoco es que hayamos ganado algo más que una mejora visual y evitar las múltiples comparaciones que hacíamos con la estructura de IF y ELSEIF, ¿por qué deberíamos utilizar SWITCH?

Está estudiado y analizado que la estructura SWITCH, por la forma en que está construido internamente, es más eficiente que empezar a anidar IF. Por tanto, en cuanto tengamos una serie de IF bastante larga, con muchos ELSEIF, podemos plantearnos el utilizar esta estructura, mejorar su legibilidad y también la eficiencia. Además, no es que hayamos aumentado mucho la dificultad, pues sólo debemos acordarnos bien de escribir el break.

Otro pequeño ejemplo – inicializar valor antes de un WHILE

Íbamos a ver las estructuras de control SWITCH y DO WHILE, así que vista la primera de ellas, vamos con la segunda. Imaginemos ahora que tenemos un dado de 12 caras en esta ocasión, pero realmente queremos jugar al parchís y no encontramos el dado de 12 caras (situación absurda, lo sé). Podríamos jugar igualmente con la norma de que, cuando obtengamos un número mayor de 6, entonces volvemos a tirar. Vamos a expresarlo en un pequeño programa mediante un bucle WHILE:

<?php

$lanzamiento = rand(1, 12);

while ($lanzamiento > 6) {
	$lanzamiento = rand(1, 12);
}

echo 'El lanzamiento ha sido ' . $lanzamiento;

?>

Nuestro programa, inicialmente, realiza un lanzamiento. Posteriormente y mediante un bucle WHILE comprobamos si el lanzamiento ha sido mayor de 6 o no. Si ha sido mayor, volvemos a lanzar. Este bucle terminará en el momento en que $lanzamiento sea menor o igual a 6 y, finalmente, imprimimos el número del lanzamiento por pantalla.

Si nos fijamos en este programita, tenemos dos veces escrita la instrucción $lanzamiento = rand(1, 12), pues vamos a lanzar el dado sí o sí una primera vez y, si no sale el valor esperado, seguiremos lanzando. ¿Hay alguna forma de decirle que lance el dado al menos una vez y no tengamos que escribirlo dos veces? Sí, la hay.

La estructura de control DO WHILE

La estructura de control DO WHILE se podría traducir como “haz … mientras …”. La diferencia de esta estructura con el WHILE que ya conocemos es que realizará la instrucción sí o sí la primera vez y luego evalúa el WHILE para saber si debe seguir ejecutándola o no. Lo veremos más claro con el código:

<?php

do {
	$lanzamiento = rand(1, 12);
} while ($lanzamiento > 6);

echo 'El lanzamiento ha sido ' . $lanzamiento;

?>

No tiene mucho secreto esta estructura. Inicialmente escribimos la palabra do y abrimos directamente paréntesis. Las instrucciones a continuación se realizarán siempre la primera vez y, luego, evalúa la condición del WHILE para saber si debe seguir o no. En nuestro ejemplo entonces, $lanzamiento = rand(1, 12) siempre se ejecutará una vez con seguridad. Si el valor que se obtiene no es mayor que 6, entonces saldrá y terminará. Pero si fuera mayor que 6 (condición del WHILE) entonces volverá a ejecutar el lanzamiento.

Es, por tanto, una estructura muy práctica cuando estamos seguros de que las instrucciones se deben ejecutar una vez como mínimo. Podemos hacerlo exactamente igual con el bucle WHILE como hemos visto antes. Pero que sepamos que esta opción existe y cuál es su utilidad.

Ampliando nuestra mochila de funcionalidades

Finalizamos aquí el artículo habiendo presentado estas sencillas estructuras de control SWITCH y DO WHILE. Son, como hemos dicho, estructuras no necesarias y podemos seguir programando sin ellas, pero pueden sernos útiles y, en ciertos casos, más eficientes. De nuevo, la habilidad del programador es fundamental en este tipo de cosas.

Deja una respuesta