Lecciones de PHP - Lección 12 - Bucles while, foreach, for
Bastante a menudo en programación, y también en la vida diaria, tenemos que realizar acciones repetitivas hasta obtener el resultado deseado. En la vida diaria lo llamamos tortura, en programación lo llamamos bucles (loops). Los bucles son muy comunes en PHP porque son una forma práctica de recorrer arrays, calcular funciones, y muchas otras cosas. Comencemos con el más simple y popular: while.
Bucles while en PHP
while
es muy simple: entre paréntesis escribimos la condición, y entre llaves lo que debe ejecutarse mientras esa condición sea verdadera. La condición es una expresión lógica que puede ser TRUE
o FALSE
. Si quieres repasar las expresiones lógicas, consulta la lección sobre el operador if
. Veamos un ejemplo con while
:
<?php $counter = 5; $newArray = array(); while($counter > 2){ $newArray[]= $counter; $counter--; } print_r($newArray); ?>
El resultado será un array con los elementos 5, 4, 3. Veamos cómo ocurre esto paso a paso:
Paso 1. $counter = 5 (5 > 2)
Paso 2. $counter = 4 (4 > 2)
Paso 3. $counter = 3 (3 > 2)
Paso 4. $counter = 2 (2 = 2, la condición ya no se cumple, por eso no se ejecuta la acción y no aparece el 2 en el array)
Ahora otro ejemplo: tabulación de la función y(x) = 2x - 1:
<?php // función y(x) = 2x -1; $x = -10; while($x <= 10){ $y = 2*$x-1; print 'y(' . $x . ')=' . $y . '<br />'; $x++; } ?>
Como resultado, se mostrarán en columna los valores de la función para x en el intervalo [-10, 10].
Este es el diagrama de flujo de un bucle while
. Es el esquema general de cómo funciona este bucle. Tenemos una condición y el cuerpo del bucle; mientras la condición se cumpla, el cuerpo se ejecuta. Cuando deja de cumplirse, PHP continúa con el siguiente código.
Un punto MUY IMPORTANTE: si eliminas la línea $x++
, el contador no cambiará y la condición se seguirá cumpliendo para siempre.
<?php // función y(x) = 2x -1; $x = -10; while($x <= 10){ $y = 2*$x-1; print 'y(' . $x . ')=' . $y . '<br />'; // $x++; } ?>
Entonces pasará algo muy, muy malo. Ocurrirá un error crítico: el cuerpo del bucle se ejecutará infinitamente. Esta situación se llama bucle infinito o loop infinito. ¡Evita este tipo de errores, pueden hacer que tu sitio web deje de funcionar!
Bucles foreach en PHP
Otro bucle muy útil, especialmente cuando necesitas recorrer un array. Por recorrer me refiero a tomar un elemento, hacer algo con él, luego el siguiente, hacer lo mismo, y así hasta el final.
Veamos un ejemplo. Supongamos que tenemos diez elementos: "rojo" y "azul". Contemos cuántos elementos "rojo" hay:
<?php $counter = 0; $newArray =array( 1=>'rojo', 2=>'azul', 3=>'azul', 4=>'rojo', 5=>'rojo', 6=>'azul', 7=>'rojo', 8=>'azul', 9=>'rojo', 10=>'azul', ); foreach($newArray as $key){ if($key == 'rojo'){ $counter++; } } print 'Tenemos ' . $counter . ' elementos rojos'; ?>
Creo que este ejemplo es claro. El operador as
se usa para recorrer los elementos uno por uno. Cuando se terminan, foreach
finaliza.
Pero no todos los arrays son simples; a veces contienen arrays anidados. Y cada subarray también puede recorrerse:
<?php $counter = 0; $newArray = array( 1=>array( 1 => 'rojo', 2 => 'azul', 3 => 'azul', ), 2=>array( 1 => 'rojo', 2 => 'rojo', 3 => 'azul', ) ); foreach($newArray as $key){ foreach($key as $element){ if($element == 'rojo'){ $counter++; } } } print 'Tenemos ' . $counter . ' elementos rojos'; ?>
Creo que por ahora foreach
está más o menos claro. Lo volverás a ver en otros ejemplos más adelante.
Bucle FOR
El bucle for
se parece al while
. For
se usa comúnmente cuando se conoce de antemano cuántas repeticiones se necesitan, por ejemplo 10 o 100 repeticiones:
for($i=0;$i<10;$i++){ //diez repeticiones }
Ahora expliquemos la estructura del bucle for
:
for(){ }
Como en los otros bucles, todos los parámetros se escriben entre paréntesis. Generalmente se usan tres parámetros:
1. $i=0
– inicialización del contador, la variable que guarda el número de iteración actual.
2. $i<10
– condición que debe cumplirse para que el bucle continúe.
3. $i++
– incremento del contador, que nos lleva a la siguiente repetición.