Die array_walk()-Funktion in PHP: Effiziente Array-Manipulation
Lernen Sie, wie PHP's array_walk() einen Callback auf jedes Array-Element anwendet – mit Syntax, Beispielen, Fallstricken und Vergleich zu array_map().
array_walk() ist eine eingebaute PHP-Funktion, die einen Callback auf jedes Element eines Arrays direkt anwendet. Im Gegensatz zu array_map(), das ein neues Array erstellt und zurückgibt, durchläuft array_walk() das vorhandene Array und ermöglicht es, jedes Element direkt über eine Referenz zu ändern. Diese Seite behandelt die Syntax, wann man sie anstelle einer einfachen foreach-Schleife oder array_map() einsetzen sollte, häufige Fallstricke beim Ändern von Werten sowie die Verwendung von array_walk_recursive() für verschachtelte Arrays.
Syntax
array_walk(array &$array, callable $callback, mixed $arg = null): true| Parameter | Erforderlich | Beschreibung |
|---|---|---|
$array | Ja | Das zu iterierende Array. Es wird per Referenz übergeben, sodass der Callback seine Elemente ändern kann. |
$callback | Ja | Ein Callable, das einmal pro Element ausgeführt wird. Seine Signatur ist callback($value, $key, $arg). Um ein Element zu ändern, muss der erste Parameter per Referenz deklariert werden: function (&$value) { ... }. |
$arg | Nein | Ein optionales zusätzliches Argument, das als dritter Parameter an jeden Callback-Aufruf übergeben wird. |
array_walk() gibt immer true zurück (es gibt nur bei einem Typfehler false zurück). Es gibt nicht das geänderte Array zurück – das übergebene Array wird direkt geändert.
Warum
$valueper Referenz übergeben? Ohne das&erhält der Callback eine Kopie jedes Elements, sodass alle Änderungen verworfen werden. Fügen Sie&hinzu (wie infunction (&$value)), und Ihre Änderungen werden in das ursprüngliche Array zurückgeschrieben. Weitere Informationen zu Callbacks finden Sie unter PHP-Funktionen und callable.
Beispiele für die Verwendung von array_walk()
Beispiel 1: Arrays modifizieren
Eine der wichtigsten Verwendungen von array_walk() ist das Ändern von Arrays. Mit der Möglichkeit, eine benutzerdefinierte Funktion auf jedes Element eines Arrays anzuwenden, ist es eine einfache Möglichkeit, ein Array an Ihre spezifischen Anforderungen anzupassen. Hier ist ein Beispiel, wie Sie array_walk() verwenden können, um die Groß-/Kleinschreibung aller Elemente in einem Array zu ändern.
PHP-Beispiel 1: Arrays modifizieren
Ausgabe:
Array
(
[0] => APPLE
[1] => BANANA
[2] => CHERRY
)In diesem Beispiel definieren wir zunächst ein Array mit drei Elementen. Anschließend definieren wir eine benutzerdefinierte Funktion namens change_case(), die die eingebaute PHP-Funktion strtoupper() verwendet, um die Groß-/Kleinschreibung jedes Elements in Großbuchstaben zu ändern. Dann verwenden wir die Funktion array_walk(), um die Funktion change_case() auf jedes Element des Arrays anzuwenden. Schließlich verwenden wir die Funktion print_r(), um das geänderte Array auszugeben.
Beispiel 2: Berechnungen durchführen
Eine weitere leistungsstarke Verwendung von array_walk() ist die Durchführung von Berechnungen auf Arrays. Mit der Möglichkeit, eine benutzerdefinierte Funktion auf jedes Element eines Arrays anzuwenden, können Sie array_walk() für eine Vielzahl von Berechnungen auf Ihren Arrays nutzen. Hier ist ein Beispiel, wie Sie array_walk() verwenden können, um die Summe aller Elemente in einem Array zu berechnen.
Beispiel 2: Berechnungen durchführen
Ausgabe:
The total sum is: 15In diesem Beispiel definieren wir zunächst ein Array mit fünf Elementen. Anschließend definieren wir eine anonyme Funktion, die jedes Element zu einer laufenden Summe addiert. Wir verwenden die Funktion array_walk(), um die Funktion auf jedes Element des Arrays anzuwenden. Schließlich geben wir die Gesamtsumme mit der echo-Anweisung aus.
Beispiel 3: Mehrdimensionale Arrays durchlaufen
array_walk() besucht nur die Elemente der obersten Ebene. Bei einem verschachtelten Array würde Ihr Callback daher die inneren Arrays anstelle der Blattwerte erhalten. Für verschachtelte Daten verwenden Sie die Begleitfunktion array_walk_recursive(), die in Sub-Arrays hinabsteigt und Ihren Callback auf jeden Blattwert anwendet. Hier wandeln wir jeden string in einem zweistufigen Array in Großbuchstaben um.
PHP-Beispiel 3: Arbeiten mit mehrdimensionalen Arrays
Ausgabe:
Array
(
[0] => Array
(
[0] => APPLE
[1] => BANANA
[2] => CHERRY
)
[1] => Array
(
[0] => ORANGE
[1] => GRAPE
[2] => PINEAPPLE
)
)array_walk_recursive() durchläuft die Struktur tiefenrekursiv und ruft change_case() auf jeden Blatt-string auf, wobei die verschachtelte Form des Arrays erhalten bleibt und jeder Wert in Großbuchstaben umgewandelt wird.
Häufige Fallstricke
- Das
&vergessen. Wenn der erste Parameter Ihres Callbacks nicht per Referenz übergeben wird (function (&$value)), werden Ihre Änderungen stillschweigend verworfen. Dies ist der bei weitem häufigste Fehler beiarray_walk(). - Ein Rückgabewert bewirkt nichts.
array_walk()ignoriert, was immer Ihr Callback zurückgibt. Es schreibt nur Änderungen zurück, die über den Referenzparameter vorgenommen wurden. Wenn Sie stattdessen eine transformierte Kopie erstellen möchten, verwenden Siearray_map(). - Die Reihenfolge der Callback-Parameter ist
($value, $key)– erst der Wert, dann der Schlüssel. Das ist das Gegenteil von dem, was manche Entwickler erwarten. - Schlüssel können nicht hinzugefügt oder entfernt werden. Das Setzen von
$array = nullim Callback oder das Ändern der Array-Struktur während des Durchlaufs führt zu undefiniertem Verhalten. Verwenden Siearray_walk()nur, um Werte direkt zu transformieren.
array_walk() vs. array_map() vs. foreach
| Tool | Ändert direkt? | Gibt zurück | Am besten geeignet für |
|---|---|---|---|
array_walk() | Ja (per Referenz) | true | Ändern eines vorhandenen Arrays oder Ausführen eines Nebeneffekts pro Element |
array_map() | Nein | Ein neues Array | Erstellen einer transformierten Kopie ohne das Original zu berühren |
foreach | Ja (mit &$value) | — | Allgemeine Iteration mit break/continue und vollständiger Flusskontrolle |
array_reduce() | Nein | Ein einzelner Wert | Zusammenfassen eines Arrays zu einem Ergebnis (Summe, Verkettung usw.) |
Verwenden Sie array_walk(), wenn Sie dasselbe Array behalten und seine Werte direkt ändern möchten, oder wenn jeder Callback sowohl den Wert als auch den Schlüssel erhalten soll. Wählen Sie array_map(), wenn Sie ein neues Array erstellen und die Quelle unverändert lassen möchten.
Fazit
array_walk() wendet einen Callback auf jedes Element eines Arrays direkt an und ist damit eine saubere Möglichkeit, Werte zu transformieren, elementbezogene Nebeneffekte auszuführen oder Schlüssel/Wert-Paare zu verarbeiten, ohne eine explizite Schleife zu schreiben. Denken Sie daran, den Wert per Referenz zu übergeben, wenn Sie ihn ändern möchten, verwenden Sie array_walk_recursive() für verschachtelte Arrays, und bevorzugen Sie array_map(), wenn Sie lieber ein neues Array erstellen als das Original zu verändern. Weitere Informationen zum Iterieren über Arrays finden Sie unter PHP-Arrays und der foreach-Schleife.