Los bucles, también conocidos como loops o ciclos de repetición, se utilizan en programación para repetir una cierta cantidad de veces un bloque de código para así lograr resultados como por ejemplo recorrer una lista.
While
El bucle while evaluará una condición y de cumplirse realizará una operación que se repetirá tantas veces mientras que se siga cumpliendo la misma.
Por ejemplo vamos a sumar una variable numérica tantas veces mientras que ésta sea menor a 10, empezando por 0:
<?php
$contador = 1;
$limite = 10;
while($contador < $limite){
echo $contador . '<br />';
$contador++;
}
?>
Esto imprimirá por pantalla:
1 2 3 4 5 6 7 8 9
Ahora vamos a analizar el código, lo primero que evalúa el while es que se cumpla una condición que $contador (que vale por empezar 1) sea menor a $limite (que vale 10) De cumplirse esta condición se imprime por pantalla el valor de $contador, y luego se la incrementa un número más. Pensemos cómo actúa el intérprete, $contador vale 1 ¿Es menor que $limite que vale 10? Sí, así que entra, imprime $contador con un salto de línea, que es 1 y la incrementa uno más, entonces ahora $contador vale 2. Vuelve a preguntar si se cumple la condición $contador, que ahora vale 2, ¿es menor a $limite que vale 10? Sí, vuelve a entrar. Y así lo hará hasta que $contador deje de ser menor a $limite, por ende la condición no se cumplirá y el intérprete seguirá de largo.
Do while
El bucle do while funciona casi igual que el while, con la diferencia de que while primero pregunta si se cumple la condición y de ser así ejecuta el bloque de código, mientras que do while ejecuta el bloque y luego pregunta.
Por ejemplo supongamos que tenemos un código como el anterior, pero en donde la variable $contador sea 10, igual que $limite:
<?php
$contador = 10;
$limite = 10;
while($contador < $limite){
echo $contador . '<br />';
$contador++;
}
?>
Esto no imprime nada por pantalla ¿Por qué? Muy sencillo. $contador tiene el valor 10 y $limite también tiene el valor 10, primero se verifica que se cumpla la condición. ¿$contador es menor a $limite? No, entonces nunca entra el bloque de código a repetir.
Pero si en cambio hacemos esto:
<?php
$contador = 10;
$limite = 10;
do {
echo $contador . '<br />';
$contador++;
}while($contador < $limite);
?>
Esto imprime por pantalla:
10
¿Por qué? Porque el do while primero ejecuta el bloque de código, osea que imprime por pantalla el valor de $contador, que es 10 y lo incrementa uno más, osea 11. Luego sí, pregunta si $contador es menor a $limite, en nuestro ejemplo si 11 es menor a 10. ¿Lo es? No. Entonces aquí finaliza el ciclo.
For
Este bucle permite repetir un bloque de código desde un punto hasta otro, por ejemplo nosotros podemos imprimir por pantalla números desde el 1 al 10 cómo hicimos con el while, pero sin una condición:
<?php
for($i = 1; $i < 10; $i++){
echo $i . '<br />';
}
?>
Esto imprimirá por pantalla:
1 2 3 4 5 6 7 8 9
El for está compuesto por tres partes. En primer lugar creamos una variable llamada $i, con un valor inicial, en nuestro caso 1. Luego le indicamos hasta qué punto el for se repetirá, como muestra el ejemplo hasta el 10, y por último de a cuanto incrementaremos el valor de la variable $i.
También podríamos imprimir los números hasta el 10 incluido cambiando:
$i < 10
Por:
$i <= 10
Otra cosa que puede hacerse es que el bucle se repita de mayor a menor:
<?php
for($i = 9; $i > 0; $i--){
echo $i . '<br />';
}
?>
Esto nos devolverá:
9 8 7 6 5 4 3 2 1
Y para incrementar no sólo podemos hacerlo de a 1, con ++, también podemos hacerlo, por ejemplo de a 10:
<?php
for($i = 0; $i < 100; $i+=10){
echo $i . '<br />';
}
?>
Esto va a imprimir por pantalla:
10 20 30 40 50 60 70 80 90
Una utilidad que también puede tener un for es para recorrer un array:
$nombres = array('Juan', 'Pedro', 'Maria');
Deberíamos empezar por la primer posición, que es siempre 0 y luego deberíamos contar 3, que es la cantidad que tiene el array. Para saber la cantidad de posiciones que tiene un array debemos usar la función count() (ya veremos pronto que son las funciones):
$cantidad_de_nombres = count($nombres); //Esto devolverá 3.
Así que con esto nos alcanzaría para recorrer este array con un for:
<?php
$nombres = array('Juan', 'Pedro', 'Maria');
$cantidad_de_nombres = count($nombres); //Esto devolverá 3.
for($i = 0; $i < $cantidad_de_nombres; $i++){
echo $nombres[$i] . '<br />';
}
?>
Esto imprime:
Juan Pedro Maria
Aquí la variable $i, que se va autoincrementando servirá para recorrer los sub índices del array.
Foreach
Aunque el anterior ejemplo del for para recorrer un array funcione, en PHP hay una alternativa mejor a la hora de recorrer este tipo de datos. El bucle foreach está pensado justamente para este tipo de cosas:
<?php
$nombres = array('Juan', 'Pedro', 'Maria');
foreach($nombres as $item){
echo $item . '<br />';
}
?>
Como se muestra en el ejemplo debemos indicarle al foreach por empezar el array que deberá recorrer seguido por la palabra reservada as y el alias que nos servirá para referirnos la posición en cada vuelta.
También podríamos recorrer un array asociativo de la misma forma:
<?php
$perro = array(
'Nombre' => 'Charly',
'Color' => 'Blanco',
'Raza' => 'Dogo'
);
foreach($perro as $item){
echo $item . '<br />';
}
?>
Lo que va a imprimir por pantalla:
Charly Blanco Dogo
Si lo que queremos es recuperar además de los valores los índices deberíamos hacerlo de la siguiente manera:
<?php
$perro = array(
'Nombre' => 'Charly',
'Color' => 'Blanco',
'Raza' => 'Dogo'
);
foreach($perro as $indice => $valor){
echo "$indice: $valor <br />";
}
?>
Y el resultado será:
Nombre: Charly Color: Blanco Raza: Dogo
También podemos recorrer un array multidimensional:
<?php
$mercosur = array(
array('nombre' => 'Argentina', 'moneda' => 'Peso argentino'),
array('nombre' => 'Brasil', 'moneda' => 'Real'),
array('nombre' => 'Paraguay', 'moneda' => 'Guaraní'),
array('nombre' => 'Uruguay', 'moneda' => 'Peso uruguayo'),
array('nombre' => 'Venezuela', 'moneda' => 'Bolívar fuerte'),
);
foreach ($mercosur as $item){
echo "{$item['nombre']} / {$item['moneda']} <br />";
}
?>
Esto devolverá:
Argentina / Peso argentino Brasil / Real Paraguay / Guaraní Uruguay / Peso uruguayo Venezuela / Bolívar fuerte
Break y continue
Break y continue no son bucles, pero pueden usarse dentro de estos.
En el caso de break romperá el ciclo de repetición omitiendo las vueltas que sigan. Por ejemplo vamos a tener un array con varios colores y lo recorreremos con un foreach, habrá una condición dentro de cada vuelta que buscará si la posición actual de la vuelta es el color verde, y de serlo finalizará el ciclo:
<?php
$colores = array('Azul', 'Rojo', 'Amarillo', 'Verde', 'Naranja', 'Violeta');
$color_buscado = 'Verde';
foreach($colores as $item){
echo $item . '... <br />';
if($item == $color_buscado){
echo '<strong> El color ha sido encontrado. Final. </strong>';
break;
}
}
?>
Tenemos un array con distintos colores, como dijimos, recorremos la colección y buscamos el color ‘Verde’, de encontrarlo el ciclo de repetición finalizará. Por eso los últimos colores (‘Naranja’ y ‘Violeta’) no se muestran. Esto imprime por pantalla:
Azul... Rojo... Amarillo... Verde... El color ha sido encontrado. Final.
En el caso del continue no romperá el ciclo, pero salteará el resto de la vuelta. Por ejemplo, podríamos mostrar una lista desde del 1 al 10 y saltear aquellos números que sean múltiplos de 3 (3, 6 y 9)
<?php
for($i=1; $i < 10; $i++){
if($i % 3 == 0){
continue;
}
echo $i . '<br />';
}
?>
En cada bucle se mostrará un número del 1 al 10, pero antes se avaluará si el número que se va a imprimir es múltiplo de 3, y de serlo disparará un continue que hará que se ignore el resto de la vuelta. Entonces la salida al navegador será:
1 2 4 5 7 8
Anterior: Aprendiendo PHP, parte 8: Condicionales
Siguiente: Aprendiendo PHP, parte 10: Funciones
