Vollständige Anleitung zu PHPs array_walk_recursive()-Funktion
PHP array_walk_recursive(): Callback auf jeden Blattknoten in verschachtelten Arrays anwenden, Werte per Referenz ändern, mit Beispielen und Fallstricken.
array_walk_recursive() wendet einen Callback auf jeden Nicht-Array-Wert (Blattknoten) in einem Array an und steigt dabei automatisch in verschachtelte Arrays hinab. Im Gegensatz zu einem manuellen foreach müssen Sie die Rekursion nicht selbst schreiben, und im Gegensatz zu array_map() kann sie das ursprüngliche Array direkt verändern, indem sie jeden Wert per Referenz entgegennimmt.
Dieses Kapitel behandelt die Funktionssignatur, wie die Funktion verschachtelte Arrays durchläuft, die Änderung von Werten per Referenz, die Rolle des optionalen dritten Arguments und die Fallstricke, über die man stolpert (Objekte, Schlüssel und was als „Blattknoten" gilt).
Syntax
array_walk_recursive(array|object &$array, callable $callback, mixed $arg = null): true$array— das zu durchlaufende Array. Es wird per Referenz übergeben, sodass der Callback seinen Inhalt ändern kann.$callback— ein callable, der einmal pro Blattknoten aufgerufen wird und($value, $key)erhält. Deklarieren Sie$valueals&$value, um das Array direkt zu bearbeiten.$arg— ein optionales zusätzliches Argument, das (per Wert) als dritten Parameter an den Callback übergeben wird.
Die Funktion gibt true zurück. Nur Blattknoten-Werte erreichen den Callback — Schlüssel, die Sub-Arrays enthalten, werden durchlaufen, aber nie an ihn übergeben.
Wie verschachtelte Arrays durchlaufen werden
Der Callback wird für jedes skalare Element ausgelöst, und wenn ein Element selbst ein Array ist, steigt array_walk_recursive() ebenfalls in dieses Array hinab. Das folgende Beispiel gibt jedes key: value-Paar aus, einschließlich der Paare innerhalb des verschachtelten Arrays:
Ausgabe:
0: a
1: b
0: c
1: d
2: e
3: fBeachten Sie, dass das verschachtelte Array selbst (das c, d, e enthält) nicht an den Callback übergeben wird — nur seine Blattknoten werden übergeben. Die empfangenen Schlüssel sind die Schlüssel innerhalb jeder Ebene, weshalb c, d, e wieder 0, 1, 2 berichten.
Werte per Referenz ändern
Die häufigste Anwendung dieser Funktion ist die direkte Transformation einer gesamten verschachtelten Struktur. Nehmen Sie den Wert &$value per Referenz entgegen und weisen Sie ihm einen neuen Wert zu. Hier erhält jeder Preis 10 % Steuer hinzu, egal wie tief er verschachtelt ist:
<?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);
?>Ausgabe:
Array
(
[fruit] => Array
(
[apple] => 1.1
[pear] => 2.2
)
[drinks] => Array
(
[water] => 0.55
)
)Zusätzliche Daten mit dem dritten Argument übergeben
Das optionale $arg wird dem Callback (per Wert) als dritten Parameter übergeben — praktisch, um Konfiguration ohne Closure zu übergeben. Hier wird einmal ein Präfix-String angegeben und für jeden Blattknoten wiederverwendet:
<?php
$data = ['name' => 'ada', 'team' => ['bob', 'cara']];
array_walk_recursive($data, function ($value, $key, $prefix) {
echo $prefix . ucfirst($value) . "\n";
}, ">> ");
?>Ausgabe:
>> Ada
>> Bob
>> CaraDa $arg per Wert übergeben wird, können Sie es nicht verwenden, um Ergebnisse über mehrere Aufrufe hinweg zu sammeln. Um einen Wert aufzubauen, erfassen Sie stattdessen eine Variable per Referenz mit 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
?>Fallstricke
- Nur Arrays werden rekursiv durchlaufen. Ein Blattknoten ist alles, was kein Array ist — einschließlich Objekte. Ein
stdClass-Objekt innerhalb Ihrer Daten wird als einzelner Wert an den Callback übergeben, nicht durchlaufen. - Die verschachtelten Array-Knoten erreichen den Callback nie. Wenn Sie auf Container-Arrays selbst agieren müssen (nicht nur auf Blattknoten), verwenden Sie
array_walk()oder ein manuelles rekursivesforeach. - Zum Ändern ist
&$valueerforderlich. Ohne die Referenz werden Zuweisungen innerhalb des Callbacks verworfen und das ursprüngliche Array bleibt unverändert. - Schlüssel können sich über Ebenen hinweg wiederholen. Der
$key, den Sie erhalten, ist der Schlüssel auf seiner eigenen Ebene, sodass derselbe Schlüsselwert in verschiedenen Zweigen vorkommen kann.
Verwandte Funktionen
array_walk()— die gleiche Idee, aber nur eine Ebene tief.array_map()— gibt ein neues Array zurück, anstatt es direkt zu ändern.array_filter()— behält Elemente, die einen Test bestehen.- PHP Arrays — Array-Grundlagen und weitere Hilfsfunktionen.