La función array_walk() de PHP: cómo usarla para manipular arrays de forma eficiente
Aprende cómo array_walk() de PHP aplica un callback a cada elemento de un array in situ, con sintaxis, ejemplos, errores comunes y comparación con array_map().
array_walk() es una función integrada de PHP que aplica un callback a cada elemento de un array, in situ. A diferencia de array_map(), que construye y devuelve un nuevo array, array_walk() recorre el array existente y te permite modificar cada elemento directamente mediante una referencia. Esta página cubre su sintaxis, cuándo utilizarla en lugar de un bucle foreach simple o array_map(), los errores comunes al modificar valores y cómo recorrer arrays anidados con array_walk_recursive().
Sintaxis
array_walk(array &$array, callable $callback, mixed $arg = null): true| Parámetro | Requerido | Descripción |
|---|---|---|
$array | Sí | El array sobre el que se itera. Se pasa por referencia, por lo que el callback puede modificar sus elementos. |
$callback | Sí | Un callable ejecutado una vez por elemento. Su firma es callback($value, $key, $arg). Para modificar un elemento, declara el primer parámetro por referencia: function (&$value) { ... }. |
$arg | No | Un argumento extra opcional que se pasa como tercer parámetro en cada llamada al callback. |
array_walk() siempre devuelve true (devuelve false únicamente ante un error de tipo). No devuelve el array modificado — el array que pasaste se cambia directamente.
¿Por qué pasar
$valuepor referencia? Sin el&, el callback recibe una copia de cada elemento, por lo que cualquier cambio se descarta. Añade&(como enfunction (&$value)) y tus modificaciones se escriben de vuelta en el array original. Consulta funciones PHP y callable para más información sobre callbacks.
Ejemplos del uso de array_walk()
Ejemplo 1: Modificar arrays
Uno de los usos principales de array_walk() es modificar arrays. Gracias a su capacidad para aplicar una función definida por el usuario a cada elemento de un array, es una forma sencilla de transformar un array según tus necesidades específicas. A continuación se muestra un ejemplo de cómo usar array_walk() para cambiar las mayúsculas de todos los elementos de un array.
Ejemplo PHP 1: Modificar arrays
Salida:
Array
(
[0] => APPLE
[1] => BANANA
[2] => CHERRY
)En este ejemplo, primero definimos un array con tres elementos. Luego definimos una función personalizada llamada change_case() que utiliza la función integrada de PHP strtoupper() para convertir cada elemento a mayúsculas. A continuación usamos la función array_walk() para aplicar change_case() a cada elemento del array. Por último, usamos la función print_r() para mostrar el array modificado.
Ejemplo 2: Realizar cálculos
Otro uso potente de array_walk() es realizar cálculos sobre arrays. Gracias a su capacidad para aplicar una función definida por el usuario a cada elemento, puedes usar array_walk() para ejecutar una amplia variedad de cálculos sobre tus arrays. A continuación se muestra un ejemplo de cómo usar array_walk() para calcular la suma de todos los elementos de un array.
Ejemplo 2: Realizar cálculos
Salida:
The total sum is: 15En este ejemplo, primero definimos un array con cinco elementos. Luego definimos una función anónima que añade cada elemento a un total acumulado. Usamos la función array_walk() para aplicar la función a cada elemento del array. Por último, mostramos la suma total con la sentencia echo.
Ejemplo 3: Recorrer arrays multidimensionales
array_walk() simple solo visita los elementos del nivel superior, por lo que en un array anidado tu callback recibiría los arrays internos en lugar de los valores hoja. Para datos anidados, usa la función complementaria array_walk_recursive(), que desciende a los sub-arrays y ejecuta tu callback en cada valor hoja. Aquí convertimos a mayúsculas todas las cadenas de un array de dos niveles.
Ejemplo PHP 3: Trabajar con arrays multidimensionales
Salida:
Array
(
[0] => Array
(
[0] => APPLE
[1] => BANANA
[2] => CHERRY
)
[1] => Array
(
[0] => ORANGE
[1] => GRAPE
[2] => PINEAPPLE
)
)array_walk_recursive() recorre la estructura en profundidad y llama a change_case() en cada cadena hoja, manteniendo intacta la forma anidada del array mientras convierte cada valor a mayúsculas.
Errores comunes
- Olvidar el
&. Si el primer parámetro de tu callback no es por referencia (function (&$value)), las modificaciones se descartan silenciosamente. Este es el error más frecuente conarray_walk(). - Devolver un valor no tiene efecto.
array_walk()ignora lo que devuelva tu callback. Solo escribe los cambios realizados a través del parámetro de referencia. Si quieres construir una copia transformada, usaarray_map(). - El orden de los parámetros del callback es
($value, $key)— primero el valor, luego la clave. Esto es lo opuesto de lo que algunos desarrolladores esperan. - No puedes añadir ni eliminar claves. Asignar
$array = nulldentro del callback o cambiar la estructura del array durante el recorrido provoca un comportamiento indefinido. Usaarray_walk()únicamente para transformar valores in situ.
array_walk() vs. array_map() vs. foreach
| Herramienta | ¿Modifica in situ? | Devuelve | Ideal para |
|---|---|---|---|
array_walk() | Sí (mediante referencia) | true | Mutar un array existente o ejecutar un efecto secundario por elemento |
array_map() | No | Un nuevo array | Producir una copia transformada sin tocar el original |
foreach | Sí (con &$value) | — | Iteración general con break/continue y control de flujo completo |
array_reduce() | No | Un único valor | Reducir un array a un solo resultado (suma, concatenación, etc.) |
Usa array_walk() cuando quieras conservar el mismo array y cambiar sus valores in situ, o cuando necesites que cada callback reciba tanto el valor como la clave. Elige array_map() cuando quieras un array nuevo y dejar el original sin modificar.
Conclusión
array_walk() aplica un callback a cada elemento de un array in situ, lo que lo convierte en una forma limpia de transformar valores, ejecutar efectos secundarios por elemento o procesar pares clave/valor sin escribir un bucle explícito. Recuerda tomar el valor por referencia cuando pretendas modificarlo, usa array_walk_recursive() con arrays anidados y prefiere array_map() cuando prefieras construir un nuevo array en lugar de mutar el original. Para más información sobre la iteración en arrays, consulta arrays PHP y el bucle foreach.