Ver índice
Bucles while

        Ocultar índice  

   Índice de contenidos
   Instalación en Windows
   Instalación en Ubuntu
   Servidores seguros
   Páginas dinámicas
   Sintaxis básica
   Operaciones
   Arrays
   Formatos de presentación
   Operadores
   Bucles
   Extraer y ord. información
   Funciones
   Ficheros externos
   Imágenes dinámicas
   Gestión de directorios
   Cookies y sesiones
   Clases y objetos
   Ficheros en formato PDF
   Bases de datos MySQL
   PHP y XML
   PDO - Bases SQLite / MySQL
   MySQL a traves de misqli
   Algo de JavaScript y AJAX


Los bucles

La necesidad de repetir la ejecución de instrucciones es algo habitual en el mundo de la programación. Frente a la alternativa –poco práctica– de reescribir las instrucciones todos los lenguajes de programación disponen de funciones que pueden ejecutar un bloque de instrucciones de forma repetitiva.

La instrucción while

Como ocurría en el caso de if, el parámetro condición permite cualquier estructura lógica, y también dispone de distintas opciones de sintaxis.

while(condición)
       ...instrucción que se ejecutará mientras se cumpla la condición

Con esta sintaxis estaremos indicando que la instrucción siguiente (sólo una instrucción) ha de ejecutarse continua y repetidamente hasta que deje de cumplirse la condición establecida.

<?php
# asignemos un valor a la variable $A
$A=0;
/* establezcamos la condición menor que cinco
 e insertemos dentro de la instrucción algo que modifique
 el valor de esa variable de modo que en algún momento
 deje de cumplirse la condición;
 de no ocurrir esto, el bucle se repetiría indefinidamente
 en este ejemplo el autoincremento ++ de la variable
 hará que vaya modificándose su valor*/

while ($A<5) echo "El valor de A es: ",$A++,"<br>";
# comprobemos que este while solo ejecuta una instrucción
# la delimitada por el punto y coma anterior
print("Esto solo aparecerá una vez. While no lo incluye en su bucle");
?>
ejemplo55.php
while(condición) {
       ...instrucción que se ejecutará mientras se cumpla la condición...
       ....otra ...instrucción que se ejecutará mientras se cumpla la condición...
       ..........
}

De forma similar a la utilizada en el caso de if, también en este caso, las llaves hacen la función de contenedores de las instrucciones cuya ejecución debe repetirse mientras se cumpla la condición.

<?php
$A=0; 
/* utilicemos ahora el bucle para crear un tabla HTML
   empecemos escribiendo la etiqueta de apertura de esa tabla
   fuera del bucle (ya que esa se repite una sola vez)
   y utilicemos el bucle para escribir las celdas y sus contenidos */

print ("<table width=300 border=2>");

while ($A<=5){
      echo "<tr><td align=center>";
      print $A;
# esta instrucción es importantísima
# si no modificamos el valor de $A el bucle sería infinito
	  $A++;
      print("</td></tr>");
}
# cerremos la etiqueta table
print "</table>";
?>
ejemplo56.php
while(condición) :
       ...instrucción que se ejecutará mientras se cumpla la condición...
       ....otra ...instrucción que se ejecutará mientras se cumpla la condición...
       ..........
endwhile;

También aquí se mantiene la similitud con la sintaxis del condicional if. La llave ({) pueden sustituirse por (:) y en este caso en vez de (}) habría que escribir endwhile.

<?php
# utilicemos whiles anidados para construir una tabla de
$filas=5; $columnas=3;
# insertemos la etiqueta de apertura de la tabla
print ("<table border=2 width=400 align=center>");
# un primer while rojo que utiliza la condición  filas mayor que cero
# en este caso, la variable tendrá que ir disminuyendo su valor con $filas--
# para escribir las etiquetas <tr> y </tr>
# y el modificador de la variable filas
# y un segundo while (magenta) para insertar las etiquetas correspondientes
# a las celdas de cada fila
while ($filas>0):
    echo "<tr>";
    $filas--;
	while ($columnas>0):
		echo "<td>";
		print "fila: ".$filas." columna: ".$columnas;
		print ("</td>");
		$columnas--;
	endwhile;
/* ¡muy importante!. Tendremos que reasignar a la variable columnas
      su valor inicial para que pueda ser utilizado en la próxima fila
	  ya que el bucle (magenta) va reduciendo ese valor a cero
	  y en caso de no restaurar el viejo valor no volvería a ejecutarse
	  ya que no cumple la condición de ser mayor que cero */
    $columnas=3;
    echo "</TR>";
endwhile;
# por ultimo la etiqueta de cierre de la tabla
print "</table>";
?>
ejemplo57.php

Incluimos a continuación un nuevo ejemplo en el hemos hecho una ligera modificación del anterior incluyendo un condicional if. No incluimos aquí el código fuente para evitarte la monotonía de repetir íntegramente y con ligeras modificaciones el supuesto anterior. Utilizaremos un nuevo recurso de visualización tal como puedes comprobar si pulsas en el enlace Ver código fuente. Esta opción utiliza la función

show_source('pagina');

que permite visualizar el código fuente del documento que se indica en el parámetro 'pagina'. Es muy útil para nuestros propósitos pero presenta un problema de seguridad. Si escribes –en el parámetro pag– la dirección completa de una web cualquiera (que tenga extensión php) se visualizará su contenido, salvo que el PHP instalado en el servidor que la aloja la tenga expresamente desactivada.

Recuerda que en HTML se puede asignar el color fondo a una celda incluyendo bgcolor=RGB(x,y,z) –siendo x, y ,z los valores de las componentes de cada color primario– dentro de la etiqueta <TD>.

Ver nuevo ejemplo Ver código fuente
while(condición) : ?>
       ...etiquetas HTML que se insertarían repetidamente mientras se cumpla la condición
       .....
<? endwhile; ?>

También while permite cerrar el script PHP después de (:) o de la sintaxis alternativa ({) e insertar etiquetas HTML, indicando más tarde el final del bucle con <? } ?> o <? endwhile; ?>, según proceda.

Whiles anidados

Una nueva similitud sintáctica con if. En el caso de while también es posible insertar un while dentro de otro while utilizando una sintaxis de este tipo:

while(condición1):
        ...instrucción
        while(condición2) {
                ...instrucción
                .....
        }
.....
endwhile;

En esta descripción hemos utilizado dos sintaxis distintas. Por si acaso dudaras de si es necesario o no hacerlo de esa forma, te diremos que no es necesario nunca. El hecho de la anidación no limita un ápice las posibilidades de la sintaxis.