for
Aprende el bucle for en PHP: inicialización, condición e incremento, iteración de arrays, bucles anidados, infinitos y errores de desplazamiento.
El bucle for en PHP
for es el bucle controlado por contador de PHP. Se utiliza cuando sabes — o puedes calcular — exactamente cuántas veces debe ejecutarse un bloque de código, como iterar desde 0 hasta count($array) - 1, contar hacia atrás o avanzar por intervalos. Esta página cubre las tres partes del encabezado del bucle, cómo se ejecuta cada una, cómo iterar arrays, los bucles infinitos y anidados, la sintaxis alternativa endfor, y los errores de desplazamiento por uno que confunden a la mayoría de los principiantes.
Si en cambio quieres recorrer cada elemento de un array u object sin gestionar un índice, foreach suele ser la mejor opción. Para un bucle que se ejecuta hasta que una condición se vuelve falsa, consulta while. Una comparación general de todos los tipos de bucles se encuentra en PHP Loops.
Sintaxis
for (initialization; condition; increment) {
// code to be executed on each pass
}El encabezado tiene tres expresiones, separadas por punto y coma:
| Expresión | Cuándo se ejecuta | Uso típico |
|---|---|---|
initialization | Una vez, antes de que comience el bucle | Configurar un contador, p. ej. $i = 0 |
condition | Antes de cada iteración | El bucle continúa mientras sea verdadero |
increment | Después de cada iteración | Avanzar el contador, p. ej. $i++ |
El orden de ejecución es: ejecutar initialization, evaluar condition; si es verdadero, ejecutar el cuerpo, luego ejecutar increment, luego volver a evaluar condition, y así sucesivamente. En el momento en que condition se evalúa como falso, el bucle se detiene y el cuerpo no se ejecuta esa última vez.
Un primer ejemplo
<?php
for ($i = 1; $i <= 5; $i++) {
echo $i . PHP_EOL;
}
// Output:
// 1
// 2
// 3
// 4
// 5El contador comienza en 1. Después de imprimir 5, $i++ lo convierte en 6, 6 <= 5 es falso y el bucle termina — por lo que se ejecuta exactamente cinco veces.
Iterando sobre un array
Un uso clásico de for es indexar un array. Almacena en caché count() en una variable (o usa el slot de incremento) para que PHP no recuente el array en cada paso:
<?php
$colors = ["red", "green", "blue"];
for ($i = 0, $n = count($colors); $i < $n; $i++) {
echo $colors[$i] . PHP_EOL;
}
// Output:
// red
// green
// blueTen en cuenta que los índices del array comienzan en 0, por lo que el último índice válido es count($colors) - 1. La condición usa < (no <=) precisamente por esto — usar <= aquí leería un elemento más allá del final. Cuando solo necesitas los valores y no el índice, prefiere foreach, que evita toda esta clase de errores de desplazamiento por uno.
Contar hacia atrás y avanzar por intervalos
La expresión de incremento es simplemente código — puede decrementar o saltar cualquier cantidad:
<?php
// Count down
for ($i = 5; $i >= 1; $i--) {
echo $i . " ";
}
echo PHP_EOL;
// Output: 5 4 3 2 1
// Step by 2 (even numbers only)
for ($i = 0; $i <= 10; $i += 2) {
echo $i . " ";
}
// Output: 0 2 4 6 8 10Múltiples expresiones y slots vacíos
Cada uno de los tres slots puede contener varias expresiones separadas por comas, y cualquier slot puede dejarse vacío. Los puntos y coma son obligatorios incluso cuando los slots están en blanco:
<?php
// Two counters moving toward each other
for ($i = 0, $j = 10; $i < $j; $i++, $j--) {
echo "$i-$j" . PHP_EOL;
}
// Output:
// 0-10
// 1-9
// 2-8
// 3-7
// 4-6Si el slot de condición está vacío, se trata como true, lo que genera un bucle infinito. Entonces controlas la salida desde dentro del cuerpo con break:
<?php
$i = 0;
for (;;) {
if ($i >= 3) {
break;
}
echo $i . PHP_EOL;
$i++;
}
// Output:
// 0
// 1
// 2Usa continue para omitir el resto de la iteración actual y saltar directamente al paso de incremento.
Bucles anidados
Colocar un for dentro de otro te permite trabajar con cuadrículas, tablas y patrones de multiplicación. Usa nombres de contador distintos para cada nivel:
<?php
for ($row = 1; $row <= 3; $row++) {
for ($col = 1; $col <= 3; $col++) {
echo ($row * $col) . "\t";
}
echo PHP_EOL;
}
// Output:
// 1 2 3
// 2 4 6
// 3 6 9El bucle interno completa todas sus iteraciones por cada paso del bucle externo.
Sintaxis alternativa endfor
PHP ofrece una forma con dos puntos/endfor que resulta práctica al mezclar bucles con HTML en plantillas, ya que evita llaves de cierre sueltas:
<?php for ($i = 1; $i <= 3; $i++): ?>
<p>Item <?= $i ?></p>
<?php endfor; ?>Esto genera tres párrafos <p>. La misma sintaxis alternativa existe para foreach/endforeach.
Errores comunes
- Errores de desplazamiento por uno.
$i <= count($arr)lee una posición más allá del final (advertencia de índice indefinido); usa$i < count($arr). - Modificar la longitud del array dentro del bucle. Si el cuerpo agrega o elimina elementos, un
count()almacenado en caché puede quedar desactualizado — vuelve a verificarlo o cambia aforeach. - Bucles infinitos accidentales. Olvidar el incremento, o comparar en la dirección incorrecta (p. ej.
$i--con$i < 10), hace que la condición nunca sea falsa. - Contadores de punto flotante. Avanzar en
0.1acumula error de redondeo y puede sobrepasar el límite; itera con enteros y divide dentro del cuerpo en su lugar.
Cuándo usar for
Recurre a for cuando el número de iteraciones es conocido o calculado de antemano y genuinamente necesitas el índice (cuentas regresivas, repeticiones fijas, avance por intervalos, construcción de tablas). Cuando simplemente quieres cada elemento de una colección, foreach es más limpio y seguro. Cuando el número de repeticiones depende de una condición que cambia dentro del bucle, usa while o do...while.