W3docs

Guía completa de la función array_walk_recursive() de PHP

Aprende array_walk_recursive() en PHP: aplica un callback a cada hoja en arrays anidados, modifica valores por referencia, con ejemplos y advertencias.

array_walk_recursive() aplica un callback a cada valor no-array (hoja) en un array, descendiendo automáticamente en los arrays anidados. A diferencia de un foreach manual, no tienes que escribir la recursión tú mismo, y a diferencia de array_map(), puede modificar el array original en su lugar tomando cada valor por referencia.

Este capítulo cubre la firma de la función, cómo recorre arrays anidados, la modificación de valores por referencia, el papel del tercer argumento opcional y las trampas más comunes (objetos, claves y qué cuenta como una "hoja").

Sintaxis

array_walk_recursive(array|object &$array, callable $callback, mixed $arg = null): true
  • $array — el array a recorrer. Se pasa por referencia, de modo que el callback puede modificar su contenido.
  • $callback — un callable invocado una vez por hoja, que recibe ($value, $key). Declara $value como &$value para editar el array en su lugar.
  • $arg — un argumento extra opcional que se pasa (por valor) al callback como su tercer parámetro.

La función devuelve true. Solo los valores hoja llegan al callback — las claves que contienen sub-arrays se descienden pero nunca se les pasa al callback.

Cómo recorre arrays anidados

El callback se ejecuta para cada elemento escalar y, cada vez que un elemento es en sí mismo un array, array_walk_recursive() entra en ese array también. El siguiente ejemplo imprime cada par clave: valor, incluidos los que están dentro del array anidado:

php— editable, runs on the server

Salida:

0: a
1: b
0: c
1: d
2: e
3: f

Ten en cuenta que el array anidado en sí (el que contiene c, d, e) no se pasa al callback — solo sus hojas lo son. Las claves que recibes son las claves dentro de cada nivel, razón por la cual c, d, e reportan 0, 1, 2 nuevamente.

Modificar valores por referencia

El uso real más común de esta función es transformar toda una estructura anidada en su lugar. Toma el valor &$value por referencia y asígnale. Aquí cada precio recibe un 10% de impuesto añadido, sin importar lo profundo que esté anidado:

<?php

$prices = [
    'fruit'  => ['apple' => 1.00, 'pear' => 2.00],
    'drinks' => ['water' => 0.50],
];

array_walk_recursive($prices, function (&$value, $key) {
    $value = round($value * 1.10, 2); // add 10% tax
});

print_r($prices);

?>

Salida:

Array
(
    [fruit] => Array
        (
            [apple] => 1.1
            [pear] => 2.2
        )

    [drinks] => Array
        (
            [water] => 0.55
        )

)

Pasar datos extra con el tercer argumento

El $arg opcional se entrega al callback (por valor) como tercer parámetro — muy útil para pasar configuración sin necesidad de una clausura. Aquí se proporciona una cadena de prefijo una sola vez y se reutiliza para cada hoja:

<?php

$data = ['name' => 'ada', 'team' => ['bob', 'cara']];

array_walk_recursive($data, function ($value, $key, $prefix) {
    echo $prefix . ucfirst($value) . "\n";
}, ">> ");

?>

Salida:

>> Ada
>> Bob
>> Cara

Dado que $arg se pasa por valor, no puedes usarlo para acumular resultados entre llamadas. Para acumular un valor, captura una variable por referencia con use (&$total) en su lugar:

<?php

$data = [1, [2, 3], 4];
$sum = 0;

array_walk_recursive($data, function ($value, $key) use (&$sum) {
    $sum += $value;
});

echo "Sum: $sum\n"; // Sum: 10

?>

Advertencias

  • Solo se recursa en arrays. Una hoja es cualquier cosa que no sea un array — incluyendo objetos. Un stdClass dentro de tus datos se pasa al callback como un único valor, no se recorre internamente.
  • Los nodos de arrays anidados nunca llegan al callback. Si necesitas actuar sobre los arrays contenedores en sí (no solo en las hojas), usa array_walk() o un foreach recursivo manual.
  • Para modificar se requiere &$value. Sin la referencia, las asignaciones dentro del callback se descartan y el array original no cambia.
  • Las claves pueden repetirse entre niveles. La $key que obtienes es la clave en su propio nivel, por lo que el mismo valor de clave puede aparecer en diferentes ramas.

Funciones relacionadas

  • array_walk() — la misma idea, pero solo un nivel de profundidad.
  • array_map() — devuelve un nuevo array en lugar de mutar en su lugar.
  • array_filter() — conserva los elementos que superan una prueba.
  • PHP Arrays — conceptos básicos de arrays y otros ayudantes.

Práctica

Práctica
¿Qué hace la función array_walk_recursive de PHP?
¿Qué hace la función array_walk_recursive de PHP?
Was this page helpful?