Estructuras de Control
PHP Manual

foreach

PHP 4 introdujo un constructor foreach, muy parecido al de Perl y algunos otros lenguajes. Simplemente da un modo fácil de iterar sobre arrays. foreach sólo trabaja sólo sobre arrays y resultará en un error al intentar usarlo en una variable con un diferente tipo de datos o una variable no inicializada. Hay dos sintaxis; la segunda es una extensión menor, pero útil de la primera:

foreach (array_expression as $value)
    sentencias
foreach (array_expression as $key => $value)
    sentencias

La primera forma recorre el array dado por array_expression. En cada ciclo, el valor de el elemento actual es asignado a $value y el puntero interno del array es avanzado en uno (así en el próximo ciclo se estará mirando el siguiente elemento).

La segunda manera hace lo mismo, excepto que la clave del elemento actual será asignada a la variable $key en cada ciclo.

A partir de PHP 5, es posible iterar objetos también.

Note:

Cuando foreach inicia la primera ejecución, el puntero interno del array se pone automáticamente en el primer elemento del array. Esto significa que no es necesario llamar la función reset() antes de un bucle foreach.

Note:

A menos que el array este referenciado, foreach opera sobre una copia del array especificado y no sobre el propio array. foreach tiene algunos efectos secundarios sobre el puntero del array. No se puede confiar en el puntero del array durante o después del foreach sin reposicionarlo.

A partir de PHP 5, se pueden modificar fácilmente elementos del array al preceder $value con &. Esto asignará una referencia en lugar de copiar el valor.

<?php
$arr 
= array(1234);
foreach (
$arr as &$value) {
    
$value $value 2;
}
// $arr ahora es array(2, 4, 6, 8)
unset($value); // rompe la referencia con el último elemento
?>
Esto sólo es posible si el array iterado puede ser referenciado (es decir, es una variable), lo que significa que el código siguiente no funciona:
<?php
foreach (array(1234) as &$value) {
    
$value $value 2;
}

?>

Warning

Referencia del $value y el último elemento del array permanecen aún después del bucle foreach. Se recomienda destruirlos con unset().

Note:

foreach no soporta la capacidad de suprimir mensajes de error usando '@'.

Puede haber notado que las siguientes son funcionalmente idénticas:

<?php
$arr 
= array("uno""dos""tres");
reset($arr);
while (list(, 
$value) = each($arr)) {
    echo 
"Valor: $value<br />\n";
}

foreach (
$arr as $value) {
    echo 
"Valor: $value<br />\n";
}
?>
Las siguientes también son funcionalmente idénticas:
<?php
$arr 
= array("uno""dos""tres");
reset($arr);
while (list(
$key$value) = each($arr)) {
    echo 
"Clave: $key; Valor: $value<br />\n";
}

foreach (
$arr as $key => $value) {
    echo 
"Clave: $key; Valor: $value<br />\n";
}
?>

Algunos ejemplos más para demostrar su uso:

<?php
/* foreach ejemplo 1: sólo valor */

$a = array(12317);

foreach (
$a as $v) {
    echo 
"Valor actual de \$a: $v.\n";
}

/* foreach ejemplo 2: valor (con su notación de acceso manual impreso con fines ilustrativos) */

$a = array(12317);

$i 0/* sólo para efectos ilustrativos */

foreach ($a as $v) {
    echo 
"\$a[$i] => $v.\n";
    
$i++;
}

/* foreach ejemplo 3: clave y valor */

$a = array(
    
"uno" => 1,
    
"dos" => 2,
    
"tres" => 3,
    
"diecisiete" => 17
);

foreach (
$a as $k => $v) {
    echo 
"\$a[$k] => $v.\n";
}

/* foreach ejemplo 4: arrays multi-dimensionales */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";

foreach (
$a as $v1) {
    foreach (
$v1 as $v2) {
        echo 
"$v2\n";
    }
}

/* foreach ejemplo 5: arrays dinámicos */

foreach (array(12345) as $v) {
    echo 
"$v\n";
}
?>


Estructuras de Control
PHP Manual