Guide complet de la fonction array_walk_recursive() en PHP
Apprenez array_walk_recursive() en PHP : appliquez un callback à chaque feuille d'un tableau imbriqué, modifiez les valeurs par référence, exemples.
array_walk_recursive() applique un callback à chaque valeur non-tableau (feuille) d'un tableau, en descendant automatiquement dans les tableaux imbriqués. Contrairement à une boucle foreach manuelle, vous n'avez pas à écrire la récursion vous-même, et contrairement à array_map(), cette fonction peut modifier le tableau original en place en prenant chaque valeur par référence.
Ce chapitre couvre la signature de la fonction, la façon dont elle parcourt les tableaux imbriqués, la modification des valeurs par référence, le rôle du troisième argument optionnel, ainsi que les pièges courants (objets, clés, et ce qui constitue une « feuille »).
Syntaxe
array_walk_recursive(array|object &$array, callable $callback, mixed $arg = null): true$array— le tableau à parcourir. Il est passé par référence, de sorte que le callback peut modifier son contenu.$callback— un callable invoqué une fois par feuille, recevant($value, $key). Déclarez$valuecomme&$valuepour modifier le tableau en place.$arg— un argument supplémentaire optionnel passé (par valeur) au callback en tant que troisième paramètre.
La fonction retourne true. Seules les valeurs feuilles atteignent le callback — les clés qui contiennent des sous-tableaux sont parcourues mais ne lui sont jamais transmises.
Comment elle parcourt les tableaux imbriqués
Le callback se déclenche pour chaque élément scalaire, et lorsqu'un élément est lui-même un tableau, array_walk_recursive() entre dans ce tableau. L'exemple suivant affiche chaque paire key: value, y compris celles à l'intérieur du tableau imbriqué :
Résultat :
0: a
1: b
0: c
1: d
2: e
3: fNotez que le tableau imbriqué lui-même (celui qui contient c, d, e) n'est pas transmis au callback — seules ses feuilles le sont. Les clés que vous recevez sont les clés de chaque niveau, ce qui explique pourquoi c, d, e affichent à nouveau 0, 1, 2.
Modification des valeurs par référence
L'utilisation la plus courante de cette fonction consiste à transformer toute une structure imbriquée en place. Prenez la valeur &$value par référence et affectez-lui une nouvelle valeur. Ici, chaque prix se voit ajouter une taxe de 10 %, quelle que soit sa profondeur d'imbrication :
<?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);
?>Résultat :
Array
(
[fruit] => Array
(
[apple] => 1.1
[pear] => 2.2
)
[drinks] => Array
(
[water] => 0.55
)
)Passer des données supplémentaires avec le troisième argument
L'argument optionnel $arg est transmis au callback (par valeur) en tant que troisième paramètre — pratique pour passer une configuration sans closure. Ici, une chaîne de préfixe est fournie une fois et réutilisée pour chaque feuille :
<?php
$data = ['name' => 'ada', 'team' => ['bob', 'cara']];
array_walk_recursive($data, function ($value, $key, $prefix) {
echo $prefix . ucfirst($value) . "\n";
}, ">> ");
?>Résultat :
>> Ada
>> Bob
>> CaraComme $arg est passé par valeur, vous ne pouvez pas l'utiliser pour accumuler des résultats entre les appels. Pour construire une valeur, capturez plutôt une variable par référence avec use (&$total) :
<?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
?>Pièges courants
- Seuls les tableaux font l'objet d'une récursion. Une feuille est tout ce qui n'est pas un tableau — y compris les objets. Un
stdClassdans vos données est transmis au callback comme valeur unique, et non parcouru en profondeur. - Les nœuds de tableaux imbriqués n'atteignent jamais le callback. Si vous devez agir sur les tableaux conteneurs eux-mêmes (et pas seulement sur les feuilles), utilisez
array_walk()ou une boucleforeachrécursive manuelle. - La modification nécessite
&$value. Sans la référence, les affectations à l'intérieur du callback sont ignorées et le tableau original reste inchangé. - Les clés peuvent se répéter entre les niveaux. La
$keyque vous recevez est la clé au niveau courant, donc la même valeur de clé peut apparaître dans différentes branches.
Fonctions connexes
array_walk()— même principe, mais sur un seul niveau.array_map()— retourne un nouveau tableau au lieu de modifier en place.array_filter()— conserve les éléments qui passent un test.- PHP Arrays — bases des tableaux et autres fonctions utilitaires.