PHP 8.4.26 Released!

for

(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 for no es la forma recomendada de iterar sobre arrays. El bucle foreach está diseñado específicamente para este propósito y suele ser más cómodo.

+add a note

User Contributed Notes 2 notes

up
340
matthiaz
14 years ago
Looping through letters is possible. I'm amazed at how few people know that.

for($col = 'R'; $col != 'AD'; $col++) {
    echo $col.' ';
}

returns: R S T U V W X Y Z AA AB AC

Take note that you can't use $col < 'AD'. It only works with !=
Very convenient when working with excel columns.
up
73
nzamani at cyberworldz dot de
25 years ago
The point about the speed in loops is, that the middle and the last expression are executed EVERY time it loops.
So you should try to take everything that doesn't change out of the loop.
Often you use a function to check the maximum of times it should loop. Like here:

<?php
for ($i = 0; $i <= somewhat_calcMax(); $i++) {
  somewhat_doSomethingWith($i);
}
?>

Faster would be:

<?php
$maxI = somewhat_calcMax();
for ($i = 0; $i <= $maxI; $i++) {
  somewhat_doSomethingWith($i);
}
?>

And here a little trick:

<?php
$maxI = somewhat_calcMax();
for ($i = 0; $i <= $maxI; somewhat_doSomethingWith($i++)) ;
?>

The $i gets changed after the copy for the function (post-increment).
To Top