(PHP 4, PHP 5, PHP 7, PHP 8)
Los bucles for son los más complejos en PHP.
Funcionan como los bucles for del lenguaje C.
La sintaxis de los bucles for es la siguiente:
for (expr1; expr2; expr3)
comandos
La primera expresión (expr1) es evaluada (ejecutada) una sola vez, sin condición, al inicio del bucle.
Al inicio de cada iteración, la expresión
expr2 es evaluada.
Si la evaluación es true, el bucle
continúa y los comandos son ejecutados. Si
la evaluación es false,
la ejecución del bucle se detiene.
Al final de cada iteración, la expresión expr3 es evaluada (ejecutada).
Cada una de las expresiones puede estar
vacía o puede contener varias expresiones separadas por comas.
En expr2, todas las expresiones separadas por una coma
son evaluadas pero el resultado se obtiene desde la última parte.
Si la expresión expr2
es dejada vacía, esto significa que es un bucle infinito
(PHP considera implícitamente que vale true,
como en C). Esto puede ser menos inútil de lo que parece, ya que a menudo se
desea terminar el bucle con una instrucción condicional
break
en lugar de usar la expresión de verdad del for.
Considérense los siguientes ejemplos. Todos muestran los números enteros de 1 a 10:
<?php
for ($i = 1; $i <= 10; $i++) {
echo $i . " ";
}El ejemplo anterior mostrará:
1 2 3 4 5 6 7 8 9 10
<?php
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i . " ";
}El ejemplo anterior mostrará:
1 2 3 4 5 6 7 8 9 10
<?php
$i = 1;
for (; ; ) {
if ($i > 10) {
break;
}
echo $i . " ";
$i++;
}El ejemplo anterior mostrará:
1 2 3 4 5 6 7 8 9 10
<?php
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i . " ", $i++);El ejemplo anterior mostrará:
1 2 3 4 5 6 7 8 9 10
Por supuesto, el primer ejemplo es el más simple
de todos (o quizás el cuarto), pero también se puede pensar que usar una expresión vacía en un
bucle for puede ser útil a veces.
PHP también soporta la siguiente sintaxis alternativa para los bucles
for:
for (expr1; expr2; expr3):
comandos
...
endfor;
Las expresiones expr2 y expr3 se evalúan en cada iteración. Es aconsejable usar expresiones simples en estos lugares para evitar problemas de rendimiento. Por ejemplo, si el número de iteraciones se conoce de antemano, es mejor usar una variable en lugar de una llamada a función en expr2:
<?php
$people = ['Kalle', 'Pierre'];
// Mala práctica: llamar a una función en cada iteración
for($i = 0; $i < getIterationCount($people); ++$i) {
$people[$i] .= ' es genial';
}
// Buena práctica: almacenar el número en una variable
for($i = 0, $peopleCount = getIterationCount($people); $i < $peopleCount; ++$i) {
$people[$i] .= ' es genial';
}En el ejemplo anterior, la función se llama en cada iteración del primer bucle, aunque siempre devuelve el mismo valor. Almacenar ese valor en una variable, como hace el segundo bucle, llama a la función una sola vez. Tenga en cuenta que el número de iteraciones queda entonces fijado: si el array se modifica dentro del bucle, el valor almacenado ya no refleja su tamaño.
Nota:
El tamaño de un array se almacena junto con el array, lo que significa que llamar a la función nativa count() no requiere contar los elementos y no provoca problemas de rendimiento. Esto no se aplica a
COUNT_RECURSIVE, que recorre todo el array. También hay que tener cuidado al usar count() sobre objetos que implementan Countable, ya que tales llamadas pueden ser más costosas.
Nota:
El bucle
forno es la forma recomendada de iterar sobre arrays. El bucleforeachestá diseñado específicamente para este propósito y suele ser más cómodo.