# Estructuras de control

## if ... elseif ... else

Las construcciones if, else y elseif permite condicionar la ejecución de un bloque de sentencias al cumplimiento de una condición.

La sintaxis de la construcción if más sencilla es la siguiente:

    if (expresión) {
        bloque_de_sentencias
    }

La expresión se evalúa siempre, si el resultado es TRUE se ejecuta el bloque de sentencias y si el resultado es FALSE no se ejecuta el bloque de sentencias.

La construcción if se puede complicar añadiendo la instrucción else:

    if (expresión) {
        bloque_de_sentencias_1
    } else {
        bloque_de_sentencias_2
    }

La expresión se evalúa siempre, si el resultado es TRUE se ejecuta solamente el bloque de sentencias 1 y si el resultado es FALSE se ejecuta solamente el bloque de sentencias 2.

La construcción if ... else se puede complicar añadiendo la instrucción elseif:

    if (expresión_1) {
        bloque_de_sentencias_1
    } elseif (expresión_2) {
        bloque_de_sentencias_2
    } else {
        bloque_de_sentencias_3
    }

La expresión 1 se evalúa siempre, si el resultado es TRUE se ejecuta solamente el bloque de sentencias 1 y solamente si el resultado es FALSE se evalúa la expresión 2, si el resultado de esta es TRUE se ejecuta solamente el bloque de sentencias 2 y si el resultado es FALSE se ejecuta solamente el bloque de sentencias 3. En cualquier caso solamente se ejecuta uno de los tres bloques de sentencias.

Se pueden añadir tantas instrucciones elseif como se desee, teniendo en cuenta que en cualquier caso solamente se ejecuta uno de los bloques de sentencias.

    if (expresión_1) {
        bloque_de_sentencias_1
    } elseif (expresión_2) {
        bloque_de_sentencias_2
    } elseif (expresión_3) {
        bloque_de_sentencias_3
     ...
    } elseif (expresión_n) {
        bloque_de_sentencias_n
    } else {
        bloque_de_sentencias_n+1
    }

La construcción

    if (expresión_1) {
        $variable = expresion1;
    } else
        $variable = expresion2;
    }

se puede sustituir por la construcción:

    $variable = (expresión_1)? expresion1 : expresion2;

Volver al principio de la página

## switch

La sentencia switch es equivalente a una construcción if ... elseif ... en las que las expresiones son comparaciones de igualdad de la misma expresión con valores distintos.

La sintaxis de la sentencia switch es la siguiente:

    switch (expresión_1) {
        case valor_1:
            bloque_de_sentencias_1;
            break;
        case valor_2:
            bloque_de_sentencias_2;
            break;
        ...
        case valor_n:
            bloque_de_sentencias_n;
            break;
    }

que es equivalente a :

    if (expresión_1 == valor_1) {
        bloque_de_sentencias_1
    } elseif (expresión_1 == valor_2) {
        bloque_de_sentencias_2
    } elseif (expresión_1 == valor_3) {
        bloque_de_sentencias_3
     ...
    } elseif (expresión_1 == valor_n) {
        bloque_de_sentencias_n

Volver al principio de la página

## for

La sintaxis del bucle for es la siguiente:

    for (expresión_inicial; expresión_final; expresión_paso) {
        bloque_de_sentencias
    }

La expresión inicial se evalúa siempre. La expresión final se evalúa al principio de cada iteración: si el resultado es TRUE se ejecuta el bloque de sentencias y la expresión de paso y se evalúa nuevamente la expresión final; si el resultado es FALSE el bucle se termina.

Cuando se programa un bucle for hay que tener cuidado en que la expresión final vaya a cumplirse en algún momento, porque si no es así, el bucle no terminaría nunca.

En los bucles for más sencillos, en la expresión inicial se inicializa una variable que se evalúa en la expresión final y que se modifica en la expresión de paso, como muestra el ejemplo siguiente:

    <?php
    for ($i=0; $i<5; $i++) {
        print "<p>$i</p>\n";
    }
    ?>
| <p>0</p> <p>1</p> <p>2</p> <p>3</p> <p>4</p>

### Ejemplo: generación de una tabla

Para generar una tabla de varias filas se pueden utilizar bucles for anidados.

Supongamos que queremos generar la siguiente tabla:

    <table border="1">
      <caption>Tabla</caption>
      <tbody>
        <tr>
          <th></th>
          <th>1</th>
          <th>2</th>
          <th>3</th>
          <th>4</th>
        </tr>
        <tr>
          <th>1</th>
          <td>11</td>
          <td>12</td>
          <td>13</td>
          <td>14</td>
        </tr>
        <tr>
          <th>2</th>
          <td>21</td>
          <td>22</td>
          <td>23</td>
          <td>24</td>
        </tr>
        <tr>
          <th>3</th>
          <td>31</td>
          <td>32</td>
          <td>33</td>
          <td>34</td>
        </tr>
      </tbody>
    </table>
Tabla
| 1 | 2 | 3 | 4
--- | --- | --- | --- | ---
1 | 11 | 12 | 13 | 14
2 | 21 | 22 | 23 | 24
3 | 31 | 32 | 33 | 34

Para identificar las partes que son susceptibles de ser generadas por bucles, buscamos las repeticiones en el código html. El resto del contenido (que en este caso son los números) debe también seguir algún patrón, para poderlo generar aprovechando las variables que controlan los bucles.

Así, se pueden identificar tres bloques:

- Bucle 1: En la primera fila hay varias celdas <th> con números consecutivos
- Bucle 3: En cada una de las filas hay varias celdas <td> con números consecutivos
- Bucle 2: Todas las filas excepto la primera tienen la misma estructura, con número consecutivos.

El resto del código se generaría fuera de los bucles. El el cuadro siguiente se han marcado los bloques que generaría cada bucle.

    <table border="1">
      <caption>Tabla</caption>
      <tbody>
        <tr>
          <th></th>
          <th>1</th>    ⌉
          <th>2</th>    † Bucle 1
          <th>3</th>    †
          <th>4</th>    ⌋
        </tr>
        <tr>                          ⌉
          <th>1</th>                  |
          <td>11</td>   ⌉             |
          <td>12</td>   † Bucle 3     |
          <td>13</td>   †             |
          <td>14</td>   ⌋             |
        </tr>                         †
        <tr>                          |
          <th>2</th>                  |
          <td>21</td>   ⌉             |
          <td>22</td>   † Bucle 3     | Bucle 2
          <td>23</td>   †             |
          <td>24</td>   ⌋             |
        </tr>                         †
        <tr>                          |
          <th>3</th>                  |
          <td>31</td>   ⌉             |
          <td>32</td>   † Bucle 3     |
          <td>33</td>   †             |
          <td>34</td>   ⌋             |
        </tr>                         ⌋
      </tbody>
    </table>

El bucle 1 es un bucle simple. Los bucles 2 y 3 son bucles anidados que necesitan dos variables independientes para controlar cada uno de ellos. Los números contenidos en cada celda se pueden generar fácilmente a partir de las variables que controlan los bucles.

Así, el código PHP podría ser el siguiente:

    <?php

    $columnas = 4;
    $filas    = 3;

    print "<table border=\"1\">\n";            // Abre la tabla
    print "  <caption>Tabla</caption>\n";      // Crea la leyenda <caption>
    print "  <tbody>\n";                       // Abre el cuerpo de tabla <tbody>
    print "    <tr>\n";                        // Abre la primera fila
    print "      <th></th>\n";                 // Crea la primera celda <th> de la primera fila (vacía)

    for ($j=1; $j<=$columnas; $j++) {          // Bucle 1 (genera celdas <th> con número de la primera fila)
        print "      <th>$j</th>\n";              // Crea el resto de celdas <th> de la primera fila (con número)
    }
    print "    </tr>\n";                       // Cierra la primera fila

    for ($i=1; $i<=$filas; $i++) {             // Bucle 2 (genera resto de filas de la tabla)
        print "    <tr>\n";                       // Abre la fila
        print "      <th>$i</th>\n";              // Crea la primera celda <th> de cada fila (con número)
        for ($j=1; $j<=$columnas; $j++) {         // Bucle 3 (genera celdas <td> con números)
            print "      <td>$i$j</td>\n";           // Crea el resto de celdas <td> de cada fila (con números)
        }
        print "    </tr>\n";                      // Cierra la fila
    }
    print "  </tbody>\n";                      // Cierra el cuerpo de tabla <tbody>
    print "</table>\n";                        // Cierra la tabla

    ?>

En el bucle 1, la variable que controla el bucle se ha llamado $j, aunque se podría haber llamado $i. Pero como en los bucles anidados 2 y 3 la variable que crea las celdas de cada fila se ha llamado $j, en el bucle 1 se le ha llamado también $j ya que juega el mismo papel (generar las celdas de la fila).

Volver al principio de la página

## while

La sintaxis del bucle while es la siguiente:

    while (expresión) {
        bloque_de_sentencias
    }

La expresión se evalúa al principio de cada iteración: si el resultado es TRUE se ejecuta el bloque de sentencias; si el resultado es FALSE el bucle se termina.

Cuando se programa un bucle while hay que tener cuidado en que la expresión deje de cumplirse en algún momento, porque si no es así, el bucle no terminaría nunca.

En los bucles while más sencillos, antes del bucle se inicializa una variable que se evalúa en la expresión y dentro del bucle se modifica la variable, como muestra el ejemplo siguiente:

    <?php
    $i = 0;
    while ($i<5) {
        print "<p>$i</p>\n";
        $i++;
    }
    ?>
| <p>0</p> <p>1</p> <p>2</p> <p>3</p> <p>4</p>

Volver al principio de la página

## do ... while

La sintaxis del bucle do ... while es la siguiente:

    do {
        bloque_de_sentencias
    } while (expresión)

La expresión se evalúa al final de cada iteración: si el resultado es TRUE se ejecuta el bloque de sentencias; si el resultado es FALSE el bucle se termina.

El bucle do ... while es muy similar al bucle while, la principal diferencia es que en el bucle do ... while el bloque de sentencias se ejecuta por lo menos una vez mientras que en el bucle while depende de si la expresión es cierta o no la primera vez que se evalúa.

Cuando se programa un bucle do ... while hay que tener cuidado en que la expresión deje de cumplirse en algún momento, porque si no es así, el bucle no terminaría nunca.

En los bucles do ... while más sencillos, antes del bucle se inicializa una variable que se evalúa en la expresión y dentro del bucle se modifica la variable, como muestra el ejemplo siguiente:

    <?php
    $i = 0;
    do {
        print "<p>$i</p>\n";
        $i++;
    } while ($i<5)
    ?>
| <p>0</p> <p>1</p> <p>2</p> <p>3</p> <p>4</p>

Volver al principio de la página

## foreach

El bucle foreach es muy útil para recorrer matrices cuyo tamaño se desconoce o matrices cuyos índices no son correlativos o numéricos (matrices asociativas).

La sintaxis del bucle foreach más simple es la siguiente:

    foreach ($matriz as $valor) {
        bloque_de_sentencias
    }

El bucle ejecuta el bloque de sentencias tantas veces como elementos contenga la matriz $matriz y, en cada iteración, la variable $valor toma uno de los valores de la matriz.

En el ejemplo siguiente se define una matriz y se imprimen sus valores:

    <?php
    $matriz = array(0, 1, 10, 100, 1000);
    foreach ($matriz as $valor) {
        print "<p>$valor</p>\n";
    }
    ?>
| <p>0</p> <p>1</p> <p>10</p> <p>100</p> <p>1000</p>

La sintaxis del bucle foreach puede también ser la siguiente:

    foreach ($matriz as $indice => $valor) {
        bloque_de_sentencias
    }

El bucle ejecuta el bloque de sentencias tantas veces como elementos contenga la matriz $matriz y, en cada iteración, la variable $valor toma uno de los valores de la matriz y la variable $indice toma como valor el índice correspondiente. Esta construcción es muy útil

En el ejemplo siguiente se define una matriz asociativa y se imprimen sus valores:

    <?php
    $matriz = array ('red' => 'rojo', 'green' => 'verde', 'blue' => 'azul');
    foreach ($matriz as $indice => $valor) {
        print "<p>$indice : $valor</p>\n";
    }
    ?>
| <p>red : rojo</p> <p>green : verde</p> <p>blue : azul</p>

Volver al principio de la página

Esta o a está bajo una licencia de Creative Commons.