# Estructuras de control: bucle for

## El bucle 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.

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>

Volver al principio de la página

## 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

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