Muy frecuentemente en programación vamos a necesitar realizar instrucciones de forma repetitiva.
Vamos a imaginar que tenemos en nuestra base de datos un listado de clientes que necesitamos mostrar en pantalla.
Supongamos que por cada cliente que haya en la base de datos, tenemos que crear en HTML una fila de una tabla e ir asignando cada registro de cliente en sus celdas correspondientes. Sería una labor tediosa.
Gracias a los bucles, con una única instrucción podemos hacer que se lean todos los registros de una base de datos y que para cada registro se monte una fila propia en HTML.
Vamos a comentar los diferentes tipos de bucles con los que contamos en PHP.
Bucle for
El bucle for realiza repeticiones de instrucciones mientras se cumple una determinada condición.
Necesitamos especificarle tres parámetros para que funcione:
- La inicialización.
- La condición de la repetición.
- La actualización que varíe el cumplimiento de la condición.
Con lo que la estructura quedaría:
<?php
for(inicialización; condición; actualización){
instrucciones;
}
?>
Vamos a realizar un ejemplo sencillo en el que un número 0 se irá incrementando y mostrándose en pantalla hasta que llegue a 5.
<?php
for($i=0; $i <= 5; $i++){
echo “El número vale: “ . $i . “<br/>”;
}
?>
Analicemos detenidamente la línea:
for($i=0; $i <= 5; $i++)
Hemos declarado un bucle for, al que le hemos pasado como parámetros:
Inicialización: una variable llamada $i con el valor 0.
Condición: La condición es que el bucle se va a repetir mientras $i sea inferior o igual a 5.
Actualización: La actualización es que por cada repetición del bucle, $i se va a incrementar en una unidad.
El bloque de instrucciones:
echo “El número vale: “ . $i . “<br/>”;
Por cada repetición del bucle se va a imprimir en pantalla el mensaje: “El número vale: “ y el valor de $i en ese momento.
Con lo que el resultado de este bucle sería:
El número vale: 0
El número vale: 1
El número vale: 2
El número vale: 3
El número vale: 4
El número vale: 5
Haciéndole una traza a este bucle, veríamos que:
- En el primer paso $i vale 0, al evaluar la condición, $i es inferior a 5, con lo que la condición se cumple, se ejecutan las instrucciones y se incrementa $i en una unidad.
- En el segundo paso, $i ahora vale 1, al evaluar la condición, $i sigue siendo inferior a 5, con lo que la condición se cumple, se ejecutan las instrucciones y se incrementa $i en una unidad.
- …
- En el sexto paso, $i vale 5, al evaluar la condición, $i es inferior o igual a 5, con lo que la condición se cumple, se ejecutan las instrucciones y se incrementa $i en una unidad.
- En el séptimo paso, $i vale 6, al evaluar la condición, $i NO es inferior o igual a 5, con lo que la condición esta vez NO se cumple, y no se ejecuta ninguna instrucción, dando así por finalizado el bucle.
Vamos con un ejemplo más práctico:
Supongamos que necesitamos crear una tabla HTML con 3 columnas y 300 filas.
Tendríamos que crear 300 etiquetas:
<tr>
<td></td><td></td><td></td>
</tr>
Pero si ejecutamos un bucle for, esta tarea nos llevaría unos pocos segundos:
<table>
<?php
for($i=0; $i < 300; $i++){
echo “<tr><td></td><td></td><td></td></tr>”;
}
?>
</table>
Si analizamos el código, veremos que primero hemos abierto la etiqueta <table>, ya que esta etiqueta no necesitamos que se repita.
Dentro de la etiqueta <table> hemos iniciado un bucle que se ejecutara mientras la variable $i sea inferior a 300 (contando el 0 como primer valor de $i, al llegar a 299, tendríamos las 300 repeticiones),
Y el código a repetir no es más que una fila con tres columnas.
Para finalizar, salimos del código PHP y cerramos la tabla.
Podemos hacernos una idea de las posibilidades que nos aporta el uso de bucles, y del ahorro de trabajo que nos puede suponer si sabemos cuándo implementarlos.
Bucle while
El bucle while ejecuta repeticiones de instrucciones un número indeterminado de veces. Incluso es posible que no llegue a realizarse ninguna repetición, ya que lo primero que se hace es evaluar la condición para arrancar el bucle, y si esta es falsa, el bucle no se inicia.
La estructura de este bucle es:
<?php
while(condicion){
Instrucciones;
}
?>
Mientras (condición sea verdadera) Repite
Instrucciones;
Fin de repetición
Este es el bucle más utilizado para mostrar registros procedentes de una base de datos, ya que mientras haya registros que mostrar, irán apareciendo en pantalla. Cuando no haya ningún registro que mostrar, finalizará el bucle. Lo veremos con detenimiento en el apartado de Bases de datos.
Siguiendo con el ejemplo del contador numérico que usamos para el bucle for, en while se ejecutaría de la siguiente forma:
<?php
$i=0;
while($i <= 5){
echo “El valor del número es “ . $i . “<br/>”;
$i++;
}
?>
Vamos a analizar este bucle haciéndole una traza:
- Declaramos una variable $i inicializada a 0.
- Abrimos el bucle while con la condición de que $i debe ser inferior o igual a 5.
- La condición se cumple y ejecuta las instrucciones de mostrar en pantalla el texto “El valor del número es…”).
- La siguiente instrucción es incrementar $i en una unidad, con lo que al finalizar la repetición, ahora $i vale 1.
- Se vuelve a evaluar la condición. En el segundo paso $i vale 1, con lo cual la condición se cumple y se vuelve a ejecutar el bloque de instrucciones.
- Así sucesivamente, hasta que $i vale 6, de forma que la condición ya no se cumple, y el bucle finaliza.
Antes mencionamos que es posible que un bucle while no llegue a ejecutarse nunca, por ejemplo si tenemos:
<?php
$i=8;
while($i <= 5){
echo “El valor del número es “ . $i . “<br/>”;
$i++;
}
?>
De entrada $i vale 8, al evaluar la condición, esta devuelve “falso”, y el bucle no se ejecuta ninguna vez.
Bucle do… while
El bucle do…while es muy similar al bucle while, con la diferencia de que do…while sí se ejecuta al menos una vez, ya que primero se ejecuta el bloque de instrucciones y al finalizar se evalúa la condición.
Su estructura es:
<?php
do{
instrucciones;
}while(condición);
?>
La traducción literal sería:
Haz
instrucciones;
Mientras que (condición sea verdadera);
El ejemplo de los números usado en los anteriores bucles, quedaría así:
<?php
$i=0;
do{
echo “El valor del número es “ . $i . “<br/>”;
$i++;
}while($i <= 5);
?>
Vamos a analizar el bucle haciéndole una traza:
- Declaramos una variable $i inicializada a 0.
- Abrimos el bucle do…while
- Se ejecuta la primera repetición, ya que todavía no ha llegado a ninguna condición.
- Ejecutamos el bloque de instrucciones e incrementamos $i en una unidad.
- Ahora se evalúa la condición. Como $i ahora vale 1, la condición se cumple y se vuelve a ejecutar el bloque de instrucciones.
- Así sucesivamente, hasta que $i vale 6, de forma que la condición ya no se cumple, y el bucle finaliza.
Bucles infinitos
Un error muy común en programación es crear bucles infinitos, es decir, bucles que no encuentran una condición para finalizar, por lo que debemos ser cuidadosos en este sentido.
Uno de los bucles más propenso a generar repeticiones infinitas es precisamente el bucle do…while. Ya que siempre se ejecuta una primera vez, y si luego no encuentra una condición de finalización, se ejecutará infinitamente hasta que cerremos el navegador web.
Volvamos al ejemplo del contador numérico para ver un ejemplo de bucle infinito:
<?php
$i=0;
do{
echo “El valor del número es “ . $i . “<br/>”;
}while($i <= 5);
?>
Hemos suprimido la instrucción $i++;
En este caso, el bucle tendería al infinito, ya que no hay ninguna instrucción que altere a $i para entrar en la condición de finalización.
Si le hacemos una traza:
- En el primer paso del bucle, $i vale 0.
- Ejecuta el bloque de instrucciones.
- Al evaluar la condición, esta es verdadera, con lo que vuelve a repetirse el bucle.
- En el segundo paso, $i sigue valiendo 0.
- Ejecuta el bloque de instrucciones.
- Al evaluar la condición, sigue siendo verdadera, con lo que el bucle se repite una y otra vez, hasta el infinito.
Es posible que incluso se cuelgue el navegador web.
Así que debemos poner atención en la ejecución de los bucles, y asegurarnos de que este siempre va a encontrar una condición de parada.
Bucle foreach
Este bucle se usa principalmente para recorrer matrices o arrays, por lo que lo veremos en la unidad de Matrices o Arrays.
https://danisanchez.net/curso-de-php/6-matrices-o-arrays-tablas-en-php/