La fonction array_walk() de PHP : comment l'utiliser pour manipuler efficacement les tableaux
Apprenez comment array_walk() de PHP applique un callback à chaque élément d'un tableau en place, avec syntaxe, exemples, pièges et comparaison à array_map().
array_walk() est une fonction PHP intégrée qui applique un callback à chaque élément d'un array, en place. Contrairement à array_map(), qui construit et renvoie un nouvel array, array_walk() parcourt l'array existant et vous permet de modifier chaque élément directement par référence. Cette page couvre sa syntaxe, quand l'utiliser plutôt qu'une simple boucle foreach ou array_map(), les pièges courants liés à la modification des valeurs, et comment parcourir des arrays imbriqués avec array_walk_recursive().
Syntaxe
array_walk(array &$array, callable $callback, mixed $arg = null): true| Paramètre | Requis | Description |
|---|---|---|
$array | Oui | L'array à parcourir. Il est passé par référence, afin que le callback puisse modifier ses éléments. |
$callback | Oui | Un callable exécuté une fois par élément. Sa signature est callback($value, $key, $arg). Pour modifier un élément, déclarez le premier paramètre par référence : function (&$value) { ... }. |
$arg | Non | Un argument supplémentaire optionnel passé en troisième paramètre à chaque appel du callback. |
array_walk() retourne toujours true (elle retourne false uniquement en cas d'erreur de type). Elle ne retourne pas l'array modifié — l'array que vous avez passé est modifié directement.
Pourquoi passer
$valuepar référence ? Sans le&, le callback reçoit une copie de chaque élément, et toute modification est ignorée. Ajoutez&(comme dansfunction (&$value)) et vos modifications sont répercutées dans l'array d'origine. Voir les fonctions PHP et callable pour en savoir plus sur les callbacks.
Exemples d'utilisation de array_walk()
Exemple 1 : Modifier des arrays
L'un des usages principaux de array_walk() est de modifier des arrays. Grâce à sa capacité à appliquer une fonction définie par l'utilisateur à chaque élément d'un array, c'est un moyen simple de transformer un array selon vos besoins spécifiques. Voici un exemple illustrant comment utiliser array_walk() pour changer la casse de tous les éléments d'un array.
Exemple PHP 1 : Modifier des arrays
Résultat :
Array
(
[0] => APPLE
[1] => BANANA
[2] => CHERRY
)Dans cet exemple, nous définissons d'abord un array à trois éléments. Nous définissons ensuite une fonction définie par l'utilisateur appelée change_case() qui utilise la fonction PHP intégrée strtoupper() pour convertir la casse de chaque élément en majuscules. Nous utilisons ensuite la fonction array_walk() pour appliquer la fonction change_case() à chaque élément de l'array. Enfin, nous utilisons la fonction print_r() pour afficher l'array modifié.
Exemple 2 : Effectuer des calculs
Un autre usage puissant de array_walk() est d'effectuer des calculs sur des arrays. Grâce à sa capacité à appliquer une fonction définie par l'utilisateur à chaque élément d'un array, vous pouvez utiliser array_walk() pour réaliser un large éventail de calculs sur vos arrays. Voici un exemple illustrant comment utiliser array_walk() pour calculer la somme de tous les éléments d'un array.
Exemple 2 : Effectuer des calculs
Résultat :
The total sum is: 15Dans cet exemple, nous définissons d'abord un array à cinq éléments. Nous définissons ensuite une fonction anonyme qui ajoute chaque élément à un total cumulé. Nous utilisons la fonction array_walk() pour appliquer cette fonction à chaque élément de l'array. Enfin, nous affichons la somme totale à l'aide de l'instruction echo.
Exemple 3 : Parcourir des arrays multidimensionnels
array_walk() seul ne visite que les éléments de premier niveau, donc sur un array imbriqué, votre callback recevrait les arrays internes plutôt que les valeurs feuilles. Pour les données imbriquées, utilisez la fonction complémentaire array_walk_recursive(), qui descend dans les sous-arrays et exécute votre callback sur chaque valeur feuille. Ici, nous mettons en majuscules toutes les chaînes d'un array à deux niveaux.
Exemple PHP 3 : Travailler avec des arrays multidimensionnels
Résultat :
Array
(
[0] => Array
(
[0] => APPLE
[1] => BANANA
[2] => CHERRY
)
[1] => Array
(
[0] => ORANGE
[1] => GRAPE
[2] => PINEAPPLE
)
)array_walk_recursive() parcourt la structure en profondeur d'abord et appelle change_case() sur chaque string feuille, conservant la forme imbriquée de l'array tout en mettant en majuscules chaque valeur.
Pièges courants
- Oublier le
&. Si le premier paramètre de votre callback n'est pas par référence (function (&$value)), vos modifications sont silencieusement ignorées. C'est l'erreur la plus fréquente avecarray_walk(). - Retourner une valeur ne sert à rien.
array_walk()ignore tout ce que votre callback retourne. Elle n'écrit que les modifications effectuées via le paramètre de référence. Si vous souhaitez construire une copie transformée, utilisezarray_map(). - L'ordre des paramètres du callback est
($value, $key)— la valeur en premier, puis la clé. C'est l'inverse de ce à quoi certains développeurs s'attendent. - Vous ne pouvez pas ajouter ni supprimer des clés. Définir
$array = nullà l'intérieur du callback, ou modifier la structure de l'array pendant le parcours, entraîne un comportement indéfini. Utilisezarray_walk()uniquement pour transformer les valeurs en place.
array_walk() vs. array_map() vs. foreach
| Outil | Modifie en place ? | Retourne | Idéal pour |
|---|---|---|---|
array_walk() | Oui (via référence) | true | Muter un array existant, ou exécuter un effet de bord par élément |
array_map() | Non | Un nouvel array | Produire une copie transformée sans toucher l'original |
foreach | Oui (avec &$value) | — | Itération générale avec break/continue et contrôle de flux complet |
array_reduce() | Non | Une valeur unique | Réduire un array à un seul résultat (somme, concaténation, etc.) |
Optez pour array_walk() lorsque vous souhaitez conserver le même array et modifier ses valeurs en place, ou lorsque vous avez besoin que chaque callback reçoive à la fois la valeur et la clé. Choisissez array_map() lorsque vous voulez un nouvel array et laisser la source intacte.
Conclusion
array_walk() applique un callback à chaque élément d'un array en place, ce qui en fait un moyen élégant de transformer des valeurs, d'exécuter des effets de bord par élément, ou de traiter des paires clé/valeur sans écrire de boucle explicite. N'oubliez pas de prendre la valeur par référence lorsque vous souhaitez la modifier, d'utiliser array_walk_recursive() pour les arrays imbriqués, et de préférer array_map() lorsque vous préférez construire un nouvel array plutôt que de muter l'original. Pour en savoir plus sur l'itération sur les arrays, consultez les tableaux PHP et la boucle foreach.