El condicional switch - Curso de PHP y MySQL - Capítulo 16

Curso de PHP y MySQL desde cero

En PHP y en la mayoría de lenguajes de programación contamos con otro tipo de condicional no tan utilizado como el if. Se trata del condicional switch.

El condicional switch de PHP

El condicional switch funciona de manera similar al condicional if. Podemos tener varias condiciones true y una false.

Creemos un formulario para practicar un poco a la vez que aprendes este condicional.

Formulario HTML

<!doctype html>
<html>
<head>
	<meta charset="utf-8">
	<title>Curso de PHP y MySQL</title>
	<link rel="stylesheet"
	href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/css/bootstrap.min.css"
	integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
	crossorigin="anonymous">
</head>
<body>
	<section style="margin:1em">
		<form method="post">
			<fieldset>

				<!-- Título del formulario -->
				<legend>Selector INÚTIL del día de la semana</legend>

				<p>Selecciona el día de la semana en el que estás
				(o el que te dé la gana, funciona igual).</p>

				<!-- Selector día de la semana -->
				<div>
					<label>Día de la semana</label>
					<div>
						<select name="dia">
							<option value="1">Lunes</option>
							<option value="2">Martes</option>
							<option value="3">Miércoles</option>
							<option value="4">Jueves</option>
							<option value="5">Viernes</option>
							<option value="6">Sábado</option>
							<option value="7">Domingo</option>
							<option selected>Elige un día de la semana</option>
						</select>
					</div>
				</div>

				<!-- Botón de envío -->
				<div>
					<label></label>
					<div>
						<button class="btn btn-success">Enviar</button>
					</div>
				</div>

			</fieldset>
		</form>

		<div>
		<!-- Escribe el código PHP aquí -->
		</div>
	</section>
</body>
</html>

Código PHP

Aquí tienes el código PHP que vamos a utilizar, pégalo en la zona designada de la página HTML.

<?php
// Variable para el día de la semana obtenido
$dia_seleccionado = $_POST["dia"]?? null;

// Cuando se pulse el botón de "Enviar", se evalúa el valor de $dia_seleccionado
if($_POST){
	switch ($dia_seleccionado) {
		case '1':
			echo 'Hoy es lunes';
			break;

		case '2':
			echo 'Hoy es martes';
			break;

		case '3':
			echo 'Hoy es miércoles';
			break;

		case '4':
			echo 'Hoy es jueves';
			break;

		case '5':
			echo 'Hoy es viernes';
			break;

		case '6':
			echo 'Hoy es sábado';
			break;

		case '7':
			echo 'Hoy es domingo';
			break;
	}
}
?>

Resultado en el navegador

Formulario tipo select con PHP

Si pulsas sobre el formulario <select> desplegarás una lista con los 7 días de la semana. Pulsa sobre alguno y pulsa en el botón "Enviar".

Al darle al botón "Enviar", estamos enviando con POST el valor del <select>. Este se obtiene en la variable con el atributo name="dia" tal y como hemos visto en capítulos anteriores.

El valor que se almacena en la variable $dia_seleccionado es el número equivalente al atributo value de las etiquetas <option> del <select>. Es decir, si se selecciona lunes, envía un '1', si es martes, un '2' y así sucesivamente.

El if($_POST){ }, no es parte del switch ni hay que ponerlo con él. Puesto que estoy trabajando con un formulario, es necesario que el código PHP espere a que le dé al botón de enviar para que haga algo. Esto ya lo expliqué en el capítulo 9.

En el switch, se evalúa el valor de la variable dada entre sus paréntesis, si es un '1', el primer bloque de código case devuelve un valor de true y se ejecuta. Con el break evitamos que se ejecuten más bloques y el intérprete salta hasta la línea de código inmediata al cierre del switch.

Por ejemplo, $dia_seleccionado tiene un valor de '3'. El primer case da false, se salta el código. El segundo case también da false. El tercero, da true y se ejecuta. Los siguientes se ignoran.

Podemos ver que esto es parecido al condicional if en cuanto a funcionamiento.

El bloque default de switch

El bloque default de switch, se escribe para tener un bloque de código adicional en caso de que ninguno de los case devuelva true.

Comparando if y switch, podemos decir que el primer case equivale a un if. Los siguientes case equivalen a varios else if y default, equivale al else.

¿Que ocurre en el formulario si el usuario no selecciona ningún día y le da a enviar de esta forma?

Formulario tipo select con PHP

No ocurre absolutamente nada. Pues bien, escribamos un bloque default para poder contemplar esta posibilidad.

Código PHP

default:
	echo 'No has seleccionado ningún día';

Esto debes escribirlo debajo de la línea 34 del código de arriba, después del break del último case y antes de la primera llave de cierre, como si fuese el case 8.

En el bloque default puedes escribir un break de forma opcional, el resultado no afecta, ya que al estar el default abajo del todo (al final), no hay más línea de código del switch a ejecutar.

Resultado en el navegador

Ahora, si seleccionamos cualquier opción no contemplada en los case, nos ejecuttará el default.

Formulario con switch bloque default

switch vs if PHP

Veamos como se escribiría el switch de este capítulo en if para que puedas apreciar las similitudes y diferencias.

Código PHP

<?php
// Variable para el día de la semana obtenido
$dia_seleccionado = $_POST["dia"]?? null;

// Cuando se pulse el botón de "Enviar", se evalúa el valor de $dia_seleccionado
if($_POST){
	if ($dia_seleccionado == 1) {
		echo 'Hoy es lunes';

	} else if ($dia_seleccionado == 2) {
		echo 'Hoy es martes';

	} else if ($dia_seleccionado == 3) {
		echo 'Hoy es miércoles';

	} else if ($dia_seleccionado == 4) {
		echo 'Hoy es jueves';

	} else if ($dia_seleccionado == 5) {
		echo 'Hoy es viernes';

	} else if ($dia_seleccionado == 6) {
		echo 'Hoy es sábado';

	} else if ($dia_seleccionado == 7) {
		echo 'Hoy es domingo';

	} else {
		echo 'No has seleccionado ningún día';
	}
}
?>

El resultado es exactamente el mismo en ambos casos, ambos son casi iguales de largos para escribirlos. Quizás se algo más corto el if. No obstante, en este caso, aunque no es incorrecto escribir esto en un if, no es muy buena práctica que se diga, ya que en el if y else if, hay que estar escribiendo la expresión una y otra vez. Estamos comparando con valores muy simples. ¿Y si tuvieras un select con los 366 días posibles del año? ¿No sería más fácil en un switch?

Ten en cuenta esto, si tienes muchas condiciones true a comparar y son simples, utiliza un switch. Si hay pocas o muchas condiciones true algo más complejas, utiliza un if.