Start · Sprachen · PHP · Referenz · array_walk_recursive

array_walk_recursive

Funktion

Wendet eine Benutzerfunktion rekursiv auf jedes Element eines mehrdimensionalen Arrays an — verschachtelte Arrays werden durchlaufen, nicht übergeben.

seit PHP 5.0.0 Kategorie: array

Signatur

array_walk_recursive(array|object &$array, callable $callback, mixed $arg = null): bool

Beschreibung

array_walk_recursive() iteriert über alle Elemente eines Arrays und ruft für jedes nicht-Array-Element (also Blatt-Knoten) die übergebene Callback-Funktion auf. Im Gegensatz zu array_walk() wird die Funktion nicht auf Unterarrays selbst angewendet, sondern diese werden transparent durchlaufen, bis ein skalarer Wert erreicht ist.

Der Callback erhält den Wert des Elements als erstes Argument und den zugehörigen Schlüssel als zweites. Wird ein optionales drittes Argument $arg angegeben, wird es als drittes Argument an den Callback weitergereicht. Soll der Wert direkt verändert werden, muss der erste Parameter des Callbacks als Referenz deklariert sein (&$value).

Typische Einsatzbereiche sind das Bereinigen oder Escapen aller Werte in einer beliebig tiefen Datenstruktur (z. B. HTML-Sonderzeichen entfernen, Strings trimmen), das Sammeln aller Blatt-Werte in einer externen Variable oder das Normalisieren von API-Antworten mit unbekannter Tiefe.

Die Funktion gibt true zurück, wenn der Callback auf alle Elemente angewendet werden konnte. Bei einem leeren Array wird ebenfalls true zurückgegeben. Fehler im Callback werden nicht automatisch abgefangen.

Parameter

Name Typ Default Beschreibung
$array Pflicht array|object Das (möglicherweise mehrdimensionale) Array oder Objekt, dessen Elemente rekursiv verarbeitet werden sollen. Wird als Referenz übergeben, damit der Callback Werte direkt ändern kann.
$callback Pflicht callable Die aufzurufende Funktion für jedes Blatt-Element. Signatur: callback(mixed &$value, mixed $key, mixed $arg = null): void. Der erste Parameter muss als Referenz deklariert sein, wenn Werte verändert werden sollen.
$arg mixed null Ein optionaler Zusatzwert, der unverändert als drittes Argument an jeden Callback-Aufruf weitergegeben wird — nützlich für Konfigurations-Parameter oder Kontext-Daten.

Rückgabewert

Typ
bool
Beschreibung
Gibt immer true zurück. Seit PHP 8.0 gibt es keinen dokumentierten Fall, in dem false zurückgegeben wird.

Beispiele

Alle Strings in einem verschachtelten Array trimmen und escapen

<?php
$data = [
    'name'    => '  Alice ',
    'address' => [
        'street' => '  Main St. <b>1</b> ',
        'city'   => '  Berlin ',
    ],
    'tags'    => ['  php ', ' web  '],
];

array_walk_recursive($data, function (&$value) {
    if (is_string($value)) {
        $value = htmlspecialchars(trim($value), ENT_QUOTES, 'UTF-8');
    }
});

print_r($data);
Array ( [name] => Alice [address] => Array ( [street] => Main St. &lt;b&gt;1&lt;/b&gt; [city] => Berlin ) [tags] => Array ( [0] => php [1] => web ) )

Alle Blatt-Werte in einer externen Liste sammeln (via $arg)

<?php
$nested = [
    'fruits' => ['apple', 'banana'],
    'veggies' => [
        'root' => ['carrot', 'parsnip'],
        'leaf' => 'spinach',
    ],
];

$collected = [];

array_walk_recursive($nested, function ($value, $key, &$list) {
    $list[] = $value;
}, $collected);

// Hinweis: $arg wird als Kopie übergeben; für Sammlungen besser Closure mit use:
$collected2 = [];
array_walk_recursive($nested, function ($value) use (&$collected2) {
    $collected2[] = $value;
});

print_r($collected2);
Array ( [0] => apple [1] => banana [2] => carrot [3] => parsnip [4] => spinach )

// Wichtig · Fallstricke

Wichtig: Unterarrays selbst werden nicht an den Callback übergeben — nur skalare Blatt-Werte. Möchte man auch auf Zwischen-Arrays reagieren, muss man eine eigene rekursive Funktion schreiben.

$arg wird als Wert-Kopie übergeben, nicht als Referenz. Das im zweiten Beispiel gezeigte Muster mit use (&$variable) in einer Closure ist daher die zuverlässigere Methode zum Sammeln von Werten.

Wenn der Callback für ein Element false zurückgibt, wird die Iteration nicht abgebrochen — array_walk_recursive() läuft immer vollständig durch. Für unterbrechbare Traversierung empfiehlt sich eine eigene rekursive Hilfsfunktion.

Bei sicherheitskritischen Anwendungen (z. B. Escapen von Benutzereingaben) darauf achten, dass alle Eingaben tatsächlich als String vorliegen — numerische oder null-Werte werden ebenfalls übergeben und können zu unerwarteten Ergebnissen führen, wenn der Callback eine explizite Typprüfung fehlt.