each()
PHP each() devolvía el par clave-valor actual y avanzaba el puntero del array. Obsoleta en 7.2, eliminada en 8.0. Aprende su comportamiento y alternativas con foreach.
Introducción
La función each() se usaba históricamente para recorrer un array elemento a elemento, devolviendo el par clave-valor actual y avanzando el puntero interno del array. Impulsaba un idioma de bucle while que fue común para iterar arrays antes de que foreach se convirtiera en el estándar.
Importante:
each()fue obsoleta en PHP 7.2 y eliminada completamente en PHP 8.0. Llamarla en PHP 8+ lanza unErrorfatal. Esta página documenta su comportamiento heredado para que puedas leer y migrar código antiguo — pero nunca deberías escribir código nuevo con ella. Ve a Alternativas modernas para saber qué usar en su lugar.
Esta página cubre qué hacía each(), su sintaxis y forma de retorno, el comportamiento del puntero interno que la hacía complicada, y cómo reescribir cada uso con foreach.
Sintaxis
La sintaxis de la función each() es la siguiente:
Sintaxis de la función Each() en PHP
each(array $array): array|falseLa función each() toma un array como parámetro y devuelve un array o false en caso de fallo.
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
$array | array (por referencia) | El array del que leer y avanzar. Funciona tanto con arrays indexados como asociativos. |
El array se pasa por referencia porque each() lo muta — específicamente, mueve el puntero interno del array hacia adelante en cada llamada.
Valor de retorno
En cada llamada, each() devuelve un array de cuatro elementos, con claves numéricas y de cadena apuntando a los mismos datos:
| Índice | Contiene |
|---|---|
0 | la clave actual |
key | el mismo valor que 0 |
1 | el valor actual |
value | el mismo valor que 1 |
Cuando el puntero ha avanzado más allá del último elemento, each() devuelve false — que es lo que detiene el clásico bucle while.
Uso
El idioma clásico combinaba each() con un bucle while. Cada iteración tomaba un par y avanzaba el puntero; cuando no quedaban pares, each() devolvía false y el bucle terminaba.
Bucle each() heredado (PHP 7.x y anteriores)
<?php
// Legacy PHP 7.x example. This will throw a fatal Error in PHP 8.0+.
$array = ["one" => 1, "two" => 2, "three" => 3];
while ($element = each($array)) {
echo $element['key'] . ' => ' . $element['value'] . "\n";
}
// Output:
// one => 1
// two => 2
// three => 3Definimos un array asociativo y luego llamamos a each() repetidamente dentro de un while. Cada llamada devuelve el par actual (accesible como $element['key'] / $element['value']) y avanza el puntero, hasta que each() finalmente devuelve false.
El problema del puntero interno
Dado que each() consume el puntero interno, un array solo es completamente recorrible una vez. Para iterar una segunda vez había que llamar primero a reset() para rebobinar el puntero al inicio. Olvidar esto era una fuente frecuente de errores del tipo "mi bucle no hace nada" — y es una de las razones por las que each() fue finalmente eliminada en favor de foreach, que usa su propio iterador y nunca perturba el array.
Equivalente moderno en PHP 8+
Todo el patrón while (each()) se reduce a un único foreach más claro:
<?php
$array = ["one" => 1, "two" => 2, "three" => 3];
foreach ($array as $key => $value) {
echo $key . ' => ' . $value . "\n";
}
// Output:
// one => 1
// two => 2
// three => 3foreach es más corto, no toca el puntero interno (por lo que el array sigue siendo reutilizable), y es el único de los dos que funciona en PHP 8+.
each() vs. funciones de array similares
each() se agrupa a menudo con otras herramientas de iteración, pero cada una hace algo distinto:
| Función | Qué hace | ¿Devuelve un par clave/valor? | ¿Toca el puntero interno? |
|---|---|---|---|
foreach | Construcción de lenguaje para recorrer cada elemento | Sí (as $key => $value) | No |
array_walk() | Aplica un callback a cada elemento, en su lugar | No | No |
array_map() | Construye un nuevo array a partir de los resultados de un callback | No | No |
current() / next() / key() | Lee el elemento en el puntero / lo avanza / lee su clave | Parcialmente (por separado) | Sí (next()) |
Si necesitas el control manual del puntero que each() ofrecía, combina current(), key(), next() y reset() — esas funciones siguen disponibles en PHP 8+.
Estado heredado y alternativas modernas
La función each() está obsoleta (PHP 7.2) y eliminada (PHP 8.0). Para todo código nuevo:
- ¿Iterando un array? Usa
foreach. - ¿Transformando valores en un nuevo array? Usa
array_map(). - ¿Modificando elementos en su lugar? Usa
array_walk(). - ¿Necesitas avance manual? Usa
current()+next()+reset().
Conclusión
each() fue en su momento la forma preferida de recorrer un array y obtener pares clave-valor, pero su dependencia del puntero interno la hacía propensa a errores, y PHP 8.0 la eliminó por completo. Trátala como historia de solo lectura: reconócela en código heredado y reemplázala con foreach — que es más seguro, más rápido y el estándar moderno.