Características del foreach en PHP

php características del foreach

Compatibilidad PHP 4, PHP 5, PHP 7, PHP 8 +.

La construcción foreach proporciona una manera fácil de moverse entre los elementos de un arrays dígase matriz. Funciona solo con arrays y objetos. Usarla con una variable de un tipo de datos diferente o una variable no inicializada arroja un error.

Esta estructura la podemos encontrar en dos formas de sintaxis:

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

La primera fórmula pasa por la matriz foreach de acuerdo con la expresión que se le envía (array_expression). En cada ciclo, el lenguaje asigna el valor del elemento actual a la variable ‎$value y el puntero interno a la matriz avanza un paso, es decir, verá el siguiente elemento en el siguiente ciclo.

La segunda sintaxis permite una asignación adicional de asignar la clave del elemento actual a la variable ‎$key en cada ciclo. PHP permite la personalización de ciclos de objetos .

Muy importante tener en cuenta que en PHP 5, el puntero de la matriz se restablece automáticamente al primer elemento de la matriz cuando se inicia una instrucción foreach, lo que significa que no es necesario llamar a la función reset()‎antes de un bucle foreach.

El foreach en PHP 5, un ciclo depende del puntero interno de la matriz, cambiar este puntero dentro del ciclo produce resultados inesperados, pero en PHP 7 no depende foreach del puntero interno de la matriz.

Para realizar modificaciones directamente a los elementos de la matriz dentro del bucle, la etiqueta se puede agregar al &nombre de la variable, asignando así el valor a la variable por referencia.

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr ahora es array (2, 4, 6, 8)
unset($value);
// desreferenciar con el último elemento
?>

Advertencia: La relación de referencia permanece entre la variable ‎$value y el último elemento de la matriz incluso después de salir de un bucle foreach, por lo que se recomienda cancelar esta relación utilizando la función unset()‎; de lo contrario, enfrentará la situación que se muestra en el siguiente ejemplo.

Después de que se completa el foreach primer ciclo, los elementos del array toman los valores (2, 4, 6, 8) y la relación entre la variable ‎$value y el último elemento de la matriz permanece intacta a menos que sea interrumpida por unset().

En el foreach segundo ciclo, el valor del elemento se actualizará ‎$arr[3]a los valores tomados de la matriz ‎$arr, y finalmente el valor del penúltimo elemento se copiará al último valor:

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as & $value) {
    $value = $value * 2;
}
foreach ($arr as $key => $value) {
    // $ arr [3] Se actualizará un valor de la variable $ arr
    echo "{$key} => {$value} ";
    print_r($arr);
}
// salida
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
?>

Antes de PHP 5.5, una referencia de variable ‎$value solo era posible si la matriz era referenciable, es decir, se le asignó una variable. El siguiente código solo funciona en la versión 5.5.0 del idioma:

<?php
foreach (array(1, 2, 3, 4) as &$value) {
    $value = $value * 2;
}
?>

Importante saber que el foreach no admite la capacidad de omitir mensajes de error utilizando el operador ‘ @‘.

Es posible que haya notado que los dos códigos siguientes son prácticamente idénticos:

<?php
$arr = array("one", "two", "three");
reset($arr);
while (list(, $value) = each($arr)) {
    echo "Value: $value<br />\n";
}
foreach ($arr as $value) {
    echo "Value: $value<br />\n";
}
?>

Los siguientes dos códigos también son idénticos:

<?php
$arr = array("one", "two", "three");
reset($arr);
while (list($key, $value) = each($arr)) {
    echo "Key: $key; Value: $value<br />\n";
}
foreach ($arr as $key => $value) {
    echo "Key: $key; Value: $value<br />\n";
}
?>

Aquí hay más ejemplos para ilustrar cómo usar:

 <? php 
// Solo valor
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
    echo "Current value of \$a: $v.\n";
}
// Valor con sintaxis para acceso manual a elementos de matriz con fines ilustrativos
$a = array(1, 2, 3, 17);
$i = 0;
// Solo para fines de aclaración
foreach ($a as $v) {
    echo "\$a[$i] => $v.\n";
    $i++;
}
// clave y valor
$a = array(
    "one" => 1,
    "two" => 2,
    "three" => 3,
    "seventeen" => 17);
foreach ($a as $k => $v) {
    echo "\$a[$k] => $v.\n";
}
// Matrices multidimensionales
$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";
    }
}
// Matrices dinámicas
foreach (array(1, 2, 3, 4, 5) as $v) {
    echo "$v\n";
}
?>

Descomposición de matrices anidadas usando la función list ()

(PHP 5> = 5.5.0, PHP 7)

La versión 5.5 del lenguaje hizo posible navegar a través de una array de matrices y descomponer matrices anidadas en variables en el ciclo usando la función list() como un valor en el ciclo, como el ejemplo siguiente:

<? php 
$array = [
    [1, 2],
    [3, 4],
];

foreach ($array as list($a, $b)) {
// La primera variable contiene el primer elemento de la matriz anidada, 
// La segunda variable contiene el segundo.

    echo "A: $a; B: $b\n";
} 
?>

El código realizado anteriormente da el siguiente resultado:

A:  1 ;  B:  2 
A:  3 ;  B:  4

Se pueden proporcionar menos elementos en la función list() que en la matriz anidada, y el lenguaje ignorará el resto de los valores en la matriz:

 <?php
$array = [
    [1, 2],
    [3, 4],
];

foreach ($array as list($a)) {
    // Tenga en cuenta que no hay una segunda variable 
    echo "$a\n";
}
?>

El código anterior da como resultado lo siguiente: 1 y 3

Aparecerá una alerta si no hay suficientes elementos para completar una función list()‎:

<?php
$array = [
    [1, 2],
    [3, 4],
];
foreach ($array as list($a, $b, $c)) {
    echo "A: $a; B: $b; C: $c\n";
}
?>

La salida del código anterior es la siguiente:

Aviso :  Indefinido  compensado :  2  en el  ejemplo . php  en la  línea  7 
A :  1 ;  B :  2 ;  C : 

Aviso :  Indefinido  compensado :  2  en el  ejemplo . php  en la  línea  7 
A :  3 ;  B :  4 ;  C :

Registro de cambios

VersiónFunción
7.0.0foreach no utilice el puntero interno de la matriz.
5.5.0Se puede indicar ‎$value en expresiones, pero anteriormente solo se admitían variables.
5.5.0Soporte para descomponer matrices anidadas usando list()‎.