#3.2 Como funcionan IF y ELSEIF en PHP

Aprende a usar los condicionales en php con este tutorial con ejemplos de uso y explicación paso a paso.

Condicionales php ejercicios resueltos

Vamos a ver otra sentencia de las estructuras de control condicionales, la última sentencia relacionada con el condicional IF en programación php: la sentencia ELSEIF.

En esta clase del curso php voy a utilizar los siguientes conceptos:

Tras conocer y dominar el uso de IF y ELSE se nos presenta la posibilidad de prever múltiples condiciones y supuestos, todas ellas con una relación de exclusión.

Múltiples condiciones en programación php

Utilizando los condicionales IF o IF y ELSE es sencillo solucionar problemas con uno o dos posibles casos, pero así mismo, cuando se nos presentan múltiples casos relacionados, debemos anidar una y otra vez IF y ELSE, complicando el código final. 

ELSE IF nos da la posibilidad de prever un supuesto dependiente de dos condiciones: que se cumpla la propia condición (del else if) y que no se cumplan las anteriores. Esto podríamos llamarlo relación de exclusión, es decir, si y solo si los anteriores IF o ELSE IF en la cadena de condiciones no se cumplen (su condición es falsa) puede que la condición programada se dé. 

La mejor forma de visualizar mentalmente el problema es con un caso real: 

Imagina la típica película en la que tienen que desactivar una bomba, y en la que aparecen tres cables distinguidos por su color (azul, rojo, amarillo), siendo solo uno el que desactiva el contador de la bomba. Si el protagonista sigue el cable azul y ve que no tiene relación con el contador entonces tendrá que mirar si es el rojo, si estudia el cable rojo y tampoco tiene ninguna relación, procede a mirar el último, que por obligación deberá desactivar la bomba. Así, si en el procedimiento se detiene en uno de los cables y debe cortarlo, el resto ya no se comprobarían. Por lo tanto todas estas condiciones tienen una relación de exclusión (una condición excluye a las demás).

Comparación múltiples condiciones con IF y ELSE o ELSE IF

En el ejemplo anterior he expuesto un caso real donde se ve claramente un problema con tres supuestos, cable azul o cable rojo o cable amarillo. Muy bien, veamos ahora como podríamos programarlo haciendo de este caso un ejercicio php:

Imaginemos que nos pasan la siguiente información para resolver el problema:

  1. me pasan una variable $cable_a_cortar que contiene el color en texto del cable a cortar.
  2. Cuando encuentre el cable a cortar debemos mostrar un mensaje que diga: Corto el cable de color XXXX.

Múltiples condiciones con IF

<?php
if ( $cable_a_cortar == 'azul' ){
   echo 'Corto el cable de color azul';
}
if ( $cable_a_cortar == 'rojo' ){
   echo 'Corto el cable de color rojo';
}
if ( $cable_a_cortar == 'amarillo' ){
   echo 'Corto el cable de color amarillo';
}
?>

En esta solución limitada al uso único de la sentencia IF he previsto los tres casos posibles, con tres condiciones cada una. Al usar tan solo IF para el intérprete de código cada una de las condiciones no están relacionadas. ¿Qué quiere decir esto? Para el intérprete de código, aunque la primera condición se cumpla, comprobará de todas formas si las demás también se cumplen (trabajo extra innecesario para Apache). 

Como hemos visto, aunque la solución es correcta, no es eficiente, y además, es más costosa de programar que otras y más dada a posibles errores por nuestra parte. 

Múltiples condiciones con IF y ELSE

<?php
if ( $cable_a_cortar == 'azul' ) {
   echo 'Corto el cable de color azul';
} else {
   if ( $cable_a_cortar == 'rojo' ){
       echo 'Corto el cable de color rojo';
   } else {
       echo 'Corto el cable de color amarillo';
   }
}
?>

En esta solución si que estoy aplicando una relación de exclusión, evitando que el intérprete lea código innecesario, y deteniendo la ejecución de código en el primer caso de los tres que se cumpla. Por último he programado por eliminación el peor de los casos en el color amarillo con un ELSE.

Múltiples condiciones con IF y ELSE IF

<?php
if ( $cable_a_cortar == 'azul' ) {
   echo 'Corto el cable de color azul';
} else if ( $cable_a_cortar == 'rojo' ) {
   echo 'Corto el cable de color rojo';
} else {
   echo 'Corto el cable de color amarillo';
}
?>

En este último script php he programado la solución más eficiente y clara de las tres. Si lo miramos desde la traducción directa del inglés al español sería: Sí el cable a cortar es azul entonces corto el cable azul, sino si el cable a cortar es rojo entonces corto el cable rojo, sino corto el cable amarillo.

La sentencia else if me ha permitido simplificar el código de los if y else anidados, con menos tabulaciones, menos llaves y exactamente misma eficiencia.

En este ejemplo básico tan solo he utilizado un else if, pero realmente podría colocar de forma relacionada y contigua tantos else if como necesite:

Imagina que hay cinco cables en vez de tres:

<?php
if ( $cable_a_cortar == 'azul' ) {
   echo 'Corto el cable de color azul';
} else if ( $cable_a_cortar == 'rojo' ) {
   echo 'Corto el cable de color rojo';
} else if ( $cable_a_cortar == 'morado' ) {
   echo 'Corto el cable de color morado';
} else if ( $cable_a_cortar == 'negro' ) {
   echo 'Corto el cable de ¿la toma de tierra?';
} else {
   echo 'Corto el cable de color amarillo';
}
?>

Como has podido ver he acumulado tres else if uno detrás de otro, dependiendo así unos de otros con la relación de exclusión que te he introducido anteriormente, de esta forma, las condiciones se miran en el orden de lectura humano, es decir, de izquierda a derecha y de arriba abajo, y si cualquiera de ellas se cumple, el resto ya no se comprueban.

Extra: El orden de prioridad en los condicionales múltiples

Muchas veces, a parte de una relación de exclusividad, los supuestos de los problemas suelen tener una relación de prioridad. Esta relación, bien implementada, evitará errores graves y aumentará la eficiencia del algoritmo propuesto. Situaremos siempre las condiciones de mayor a menor prioridad.

Ejemplo de condicional elseif con prioridad:

Un profesional en buscado de un trabajo mejor, nos pide que le programemos un pequeño script que le solucione el problema de buscar trabajo. Ha enviado currículos a muchas empresas, pero quiere ser el primero en contestar a un posible correo de entrevista por parte de estas, y además, no quiere asistir a entrevistas innecesarias. Quiere que, al final del día, miremos automáticamente que correos ha recibido, y según las ofertas contestemos a unas u otras, y solo contestemos a la empresa más importante que se interese por su trabajo. Si no ha llegado ninguna respuesta también quiere ser notificado.

El ranking de empresas según este señor es:

  1. La empresa AlpujarrasSOFT o la empresa Poodle (no se decide por ninguna)
  2. Aceituna Technologies
  3. Lowcost Corp.
  4. Garbage Solutions.

Para solucionar el problema debemos tener en cuenta que recibiremos el remite del email en la variable $from_email y podemos utilizar la función de php strpos() que nos dice si una cadena contiene otra y en que carácter empieza:

<?php
$es_alpujarras = strpos( $from_email, 'AlpujarrasSoft' );
$es_poodle = strpos( $from_email, 'Poodle' );
$es_aceituna = strpos( $from_email, 'Aceituna Technologies' );
$es_lowcost = strpos( $from_email, 'Lowcost');
$es_garbage = strpos( $from_email, 'Garbage');
if ( false != $es_alpujarras || false != $es_poodle ) {
   if ( false != $es_alpujarras ){
       echo 'Mando email a Alpujarras';
   }
   if ( false != $es_poodle ) {
      echo 'Mando email a Poodle';
   }
} else if ( false != $es_aceituna ) {
   echo 'Mando email a Aceituna Technologies'; 
} else if ( false != $es_lowcost ) {
   echo 'Mando email a Lowcost Corp.';
} else if ( false != $es_gargable ) {
   echo 'Mando email a Gargage Solutions';
} else {
   echo 'Mejor quedarse como estás';
}
?>

En este script mucho más complejo que los anteriores, he seguido estrictamente la prioridad marcada por el cliente, y en el caso de las dos primeras, ambas con la misma prioridad, he establecido una doble condición que me permite englobar la posibilidad de que una de las dos empresas, o ambas, han contestado al correo y por lo tanto enviar el correo de vuelta a las que sean pertinente(ambas o una).

Con este código se enviará/n solo los correos con mayor prioridad (dos en el primer caso o uno en el resto), y se evitarán el resto. Por último, como descarte, dejo la posibilidad de que no ha contestado nadie a los currículos.

Sobre el autor

Javier Gómez Redactor en Srcodigofuente.es

Javier Gómez

Ingeniero técnico en informática de gestión. Desarrollador web freelance y profesor de desarrollo web a partes iguales. Testarudo autodidacta, creativo, perfeccionista y alma libre.

Cargando comentarios

Utilizamos "cookies" para información estadística. Si continúas navegando aceptas su uso.