Estructuras de control: sentencia condicional if ... elseif ... else ... (2)

Orden de los casos

En las estructuras if ... elseif ... else ... el orden en que se escriben los casos es importante y, a menudo, se pueden simplificar las condiciones ordenando adecuadamente los casos.

Podemos distinguir dos tipos de situaciones:

  1. Cuando los casos son mutuamente excluyentes
  2. Cuando unos casos incluyen a otros

Casos mutuamente excluyentes

Consideremos un programa que genera al azar un valor que corresponde a una edad y en función del valor escribe un mensaje diferente referente al plazo de renovación del carnet de conducir turismos. En España se distinguen tres situaciones (o casos):

0 18 65 edad sin carnet renueva cada 10 años renueva cada 5 años

Los casos son mutuamente excluyentes, ya que un valor de la edad sólo puede estar en uno de los casos.

Casos que se incluyen unos a otros

Consideremos un programa que pide un valor y nos dice:

Nota: El valor 0 se considerará múltiplo de 4 y de 2.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ... Pares ... Múltiplos 4 ... Impares ...

Los casos no son mutuamente excluyentes, puesto que los múltiplos de cuatro son también múltiplos de dos.

En general, el orden que permite simplificar más las expresiones suele ser considerar primero los casos particulares y después los casos generales.

Omisión de comparaciones

En algunos casos, podemos escribir una condición sin necesidad de escribir comparaciones.

Comparaciones de variables lógicas

Si trabajamos con variables lógicas, no es necesario compararlas con los valores true o false, sino que podemos utilizarlas directamente.

Por ejemplo, el programa siguiente define una variable lógica $esPepe como el resultado de una comparación. Concretamente la variable será true si la variable $nombre es la cadena "Pepe" y false si no.

<?php
$nombre = "Juan";
$esPepe = $nombre == "Pepe";

if ($esPepe == true) {
  print "<p>Su nombre es Pepe.</p>\n";
}

if ($esPepe == false) {
  print "<p>Su nombre no es Pepe.</p>\n";
}
?>
<p>Su nombre no es Pepe</p>

Pero si hacemos una tabla con los valores de las comparaciones en función de los posibles valores de $esPepe, podemos observar que la comparación de $esPepe con true da el mismo resultado que la propia variable $esPepe, mientras que la comparación con false da resultado contrario:

$esPepe $esPepe == true $esPepe == false
T T F
F F T

Por tanto en las condiciones podemos utilizar directamente la variable o su negación en vez de las comparaciones:

<?php
$nombre = "Pepe";
$esPepe = $nombre == "Pepe";

if ($esPepe) {
  print "<p>Su nombre es Pepe.</p>\n";
}

if (!$esPepe) {
  print "<p>Su nombre no es Pepe.</p>\n";
}
?>
<p>Su nombre es Pepe</p>

Comparaciones de variables numéricas

Si trabajamos con variables numéricas, no es necesario compararlas con 0, sino que podemos utilizarlas directamente, aprovechando que PHP evalúa el valor 0 (o 0.0) como false y cualquier valor distinto de cero como true.

Nota: Las conversiones implícitas de tipos deben utilizarse con cuidado, cuando estemos seguros de los valores que van a ser convertidos. El uso indiscriminado de conversiones implícitas puede producir errores imprevistos. En caso de duda, es preferible no utilizarlas.

Por ejemplo, el programa siguiente define un contador $cuenta que contiene el número de cincos obtenidos al ejecutar el bucle for.

<?php
$cuenta = 0;

for ($i = 0; $i < 3; $i++) {
    $dado = rand(1, 6);
    print "<p>Tirada de dado: $dado</p>\n";
    if ($dado == 5) {
        $cuenta++;
    }
}

if ($cuenta == 0) {
    print "<p>No ha salido ningún cinco.</p>\n";
}

if ($cuenta > 0) {
    print "<p>Han salido $cuenta cinco(s).</p>\n";
}
?>
<p>Tirada de dado: 6</p>
<p>Tirada de dado: 4</p>
<p>Tirada de dado: 1</p>
<p>No ha salido ningún cinco.</p>

Podemos escribir simplemente:

<?php
$cuenta = 0;

for ($i = 0; $i < 3; $i++) {
    $dado = rand(1, 6);
    print "<p>Tirada de dado: $dado</p>\n";
    if ($dado == 5) {
        $cuenta++;
    }
}

if (!$cuenta) {
    print "<p>No ha salido ningún cinco.</p>\n";
}

if ($cuenta) {
    print "<p>Han salido $cuenta cinco(s).</p>\n";
}
?>
<p>Tirada de dado: 5</p>
<p>Tirada de dado: 5</p>
<p>Tirada de dado: 1</p>
<p>Han salido 2 cinco(s).</p>

Comparaciones de variables de cadenas

Si trabajamos con cadenas, no es necesario compararlas con la cadena vacía, sino que podemos utilizarlas directamente, aprovechando que PHP evalúa la cadena vacía como false y cualquier valor distinto de la cadena vacía como true.

Nota: Las conversiones implícitas de tipos deben utilizarse con cuidado, cuando estemos seguros de los valores que van a ser convertidos. El uso indiscriminado de conversiones implícitas puede producir errores imprevistos. En caso de duda, es preferible no utilizarlas.

Por ejemplo, el programa siguiente define un contador $cuenta que contiene el número de cincos obtenidos al ejecutar el bucle for.

<?php
$nombre = "";

if ($nombre == "") {
    print "<p>No ha escrito su nombre.</p>\n";
}

if ($nombre != "") {
    print "<p>Su nombre es $nombre.</p>\n";
}
?>
<p>No ha escrito su nombre.</p>

Podemos escribir simplemente:

<?php
$nombre = "Alberto";

if (!$nombre) {
    print "<p>No ha escrito su nombre.</p>\n";
}

if ($nombre) {
    print "<p>Su nombre es $nombre.</p>\n";
}
?>
<p>Su nombre es Alberto.</p>

Otros

Si las condiciones if ... elseif ... cubren todas las posibilidades, se puede no escribir el bloque else:

<?php
$numero = rand(0, 100);

if ($numero % 2 == 0) {
    print "<p>$numero es par.</p>\n";
} elseif ($numero % 2 != 0) {
    print "<p>$numero es impar.</p>\n";
}

Pero lo más habitual es sustituir el último bloque elseif ... por un bloque else:

<?php
$numero = rand(0, 100);

if ($numero % 2 == 0) {
    print "<p>$numero es par.</p>\n";
} else {
    print "<p>$numero es impar.</p>\n";
}