Bucles en PHP

Como usted ya sabe, PHP maneja cuatro tipos de bucles, basados en las siguientes instrucciones:

Bucles while(condición) {…}
Bucles do {…} while (condición);
Bucles for(definición) {…}
Bucles foreach(definición) {…}

Los dos primeros son bucles que se basan en condiciones no necesariamente numéricas (aunque también pueden usar variables de control, si es necesario). Suelen usarse para reiterar sobre un proceso cuando se necesita como condición que se encuentre un determinado dato, o que el usuario introduzca una determinada respuesta en un campo, o que se complete un procesado de una cadena, etc. Además, recuerde que hay una diferencia sustancial entre ambos bucles: mientras que el primero de ellos puede no ejecutarse nunca, si al llegar a él no se cumple la condición especificada, el segundo siempre se ejecutará, al menos, una vez. Esto se debe a que, en el primero, la condición se evalúa antes del cuerpo del bucle y , en el segundo, después.

El tercer tipo de bucle de la lista debe ejecutarse siempre basándose en un proceso aritmético sobre una variable de control de tipo numérico. Se usa cuando un proceso debe ser repetido un determinado número de veces.

Por último, el bucle foreach() se emplea para iterar sobre matrices. Sin embargo, tenga en cuenta una cosa. Este bucle no actúa, directamente, sobre una matriz, sino sobre una copia de la misma. Por esta razón no servirá para modificar, dentro del cuerpo del bucle, el contenido de la matriz. Suponga el siguiente fragmento de un script:

foreach ($matriz as $clave=>$valor){
echo ($clave." *** ".$valor."<br />");
}

Este opera, en realidad, sobre una copia de los datos contenidos en $matriz. Por supuesto, usted puede incluir, dentro del cuerpo del bucle, la instrucción siguiente:

$matriz[$clave]="nuevo valor";

Esto modificará el contenido del elemento al que se apunte mediante $clave. No obstante, las especificaciones oficiales de PHP sugieren que , cuando se deba modificar el contenido de uno o más elementos de una matriz. se use un bucle de tipo for(), poniendo como límite de la variable de control el número de elementos de la matriz, obtenido mediante la función count().

Uno de los aspectos que debe tener en cuenta a la hora de manejar bucles es la posibilidad de interrumpir forzadamente la iteración, o bien pasar a la siguiente. Esto se lleva a cabo con las instrucciones break y continue, como usted sabe. Lo que no todo el mundo conoce (a pesar de estar documentado en el manual oficial de PHP) hay que escapar antes de salir o de pasar a la siguiente iteración en el caso de usar bucles anidados. Suponga el siguiente fragmento de un script:

for ($i=0; $i<10; $i++){
for ($j=0; $j<10; $j++){
if ($j%2!=0) continue;
echo $i."---".$j."<br />";
}
}

Al ejecutarse, cada vez que $j sea un número impar, el bucle interior iniciará una nueva iteración. Por esta razón, sólo se nos mostrarán los valores pares de $j, aunque se mostrarán todos los posibles valores (de 0 a 9) para la variable $i, correspondiente al bucle exterior.

Sin embargo, si ahora sustituimos la instrucción continue (dentro del bucle interior) por continue 2, obtendremos el siguiente fragmento:

for ($i=0; $i<10; $i++){
for($j=0; $j<10; $j++){
if ($j%2!=0) continue 2;
echo $i."---".$j."<br />";
}
}

En este caso, el resultado es muy diferente, ya que, cada vez que $j alcanza el primer valor impar (el 1) se salta a la siguiente iteración del bucle exterior, y el bucle interior se reinicializa desde el principio.

Lo mismo es aplicable a la instrucción break.

Comparte