PHP Array Reduce Funktion: Der ultimative Leitfaden
Die PHP-Funktion array_reduce() ist ein mächtiges Werkzeug, um Arrays zu verarbeiten und auf einen einzigen Wert zu reduzieren. Ideal zum Summieren.
array_reduce() durchläuft ein array Element für Element und faltet es auf einen einzelnen Wert zusammen — eine Summe, eine Anzahl, das größte Element, eine neu aufgebaute Struktur usw. Bei jeder Iteration übergibt es zwei Dinge an Ihren Callback: das bisherige Ergebnis (den Akkumulator, üblicherweise $carry genannt) und das aktuelle Element ($item). Was auch immer der Callback zurückgibt, wird zum neuen Akkumulator für die nächste Iteration, und der finale Akkumulator ist das, was array_reduce() zurückgibt.
Greifen Sie darauf zurück, wenn Sie ein gesamtes array auf ein Ergebnis reduzieren müssen und ein einzelner array_sum()-, array_filter()- oder array_map()-Aufruf nicht ausreicht — zum Beispiel beim Summieren bestimmter Elemente, beim Aufbau einer Lookup-Tabelle oder beim Finden eines Maximums mit benutzerdefinierter Logik. Dieser Leitfaden behandelt die Syntax, den Akkumulatorfluss, häufige Muster und die Fallstricke, über die man stolpert.
Syntax
array_reduce(array $array, callable $callback, mixed $initial = null): mixed| Parameter | Beschreibung |
|---|---|
$array | Das Eingabe-array, das gefaltet werden soll. |
$callback | Funktion, die einmal pro Element aufgerufen wird. Sie erhält ($carry, $item) und muss den neuen Akkumulator zurückgeben. |
$initial | Optionaler Startwert für $carry. Standardmäßig null. |
Die Callback-Signatur lautet:
function (mixed $carry, mixed $item): mixed$carryenthält das bisher akkumulierte Ergebnis — beim ersten Aufruf$initial.$itemist das aktuelle array-Element.- Der Rückgabewert wird für das nächste Element zu
$carry. Das Vergessen desreturnist der häufigste Fehler.
array_reduce() ignoriert die Schlüssel des arrays; nur die Werte werden an den Callback übergeben. Wenn Sie die Schlüssel benötigen, iterieren Sie manuell oder verwenden Sie zuerst array_keys().
Häufige Anwendungsfälle
array_reduce() glänzt immer dann, wenn viele Werte zu einem werden sollen. Typische Muster sind:
- Summieren oder Multiplizieren von Elementen
- Zählen von Elementen, die eine Bedingung erfüllen
- Aufbau eines assoziativen arrays (Lookup-Tabelle) aus einer Liste
- Glätten oder Zusammenführen verschachtelter arrays
- Finden eines Minimums oder Maximums mit benutzerdefinierter Vergleichslogik
Beispiel 1: Elemente in einem Array summieren
Die einfachste Verwendung ist das Addieren von Zahlen. Der Callback addiert das aktuelle Element zum laufenden Gesamtwert, und die als $initial übergebene 0 lässt die Summe bei null beginnen.
$carry hält den laufenden Gesamtwert, beginnend bei 0, und $item ist die aktuelle Zahl. Für eine einfache Summe wie diese könnten Sie auch die eingebaute Funktion array_sum() verwenden — array_reduce() wird nützlich, wenn die Akkumulation benutzerdefinierte Logik erfordert (nur gerade Zahlen summieren, multiplizieren usw.).
Beispiel 2: Elemente in einem Array zählen
Sie können Elemente zählen, indem Sie den Akkumulator bei jeder Iteration erhöhen, anstatt den Wert des Elements hinzuzufügen. Beachten Sie, dass $item hier absichtlich nicht verwendet wird — array_reduce() zwingt Sie nicht, das aktuelle Element zu nutzen.
In diesem Beispiel verfolgt die Variable $carry die Anzahl, beginnend bei 0. Die Variable $item enthält das aktuell verarbeitete Element, wird in diesem Fall aber nicht verwendet.
Beispiel 3: Ein assoziatives Array (Lookup-Tabelle) aufbauen
Ein sehr praktisches Muster ist das Umwandeln einer Liste von Datensätzen in eine Schlüssel-Lookup-Tabelle, damit Sie einen Eintrag nach Namen finden können, anstatt die gesamte Liste zu durchsuchen. Der Akkumulator beginnt als leeres array und erhält pro Datensatz einen neuen Schlüssel.
<?php
$data = array(
array("name" => "John", "age" => 25),
array("name" => "Jane", "age" => 30),
array("name" => "Jim", "age" => 35)
);
$people = array_reduce($data, function($carry, $item) {
$carry[$item["name"]] = $item["age"];
return $carry;
}, array());
print_r($people);
?>Das Ergebnis ist Array ( [John] => 25 [Jane] => 30 [Jim] => 35 ). Jedes $item ist ein Personendatensatz; der Callback verwendet den Namen der Person als Schlüssel und ihr Alter als Wert und gibt das aktualisierte array zurück, damit die nächste Iteration es erweitern kann.
Beispiel 4: Verschachtelte Arrays glätten
Sie können ein array von arrays zu einem flachen array zusammenführen, indem Sie jedes Teil-array in den Akkumulator eingliedern. Da array_merge() ein neues array zurückgibt, bleibt $carry durch das Zurückgeben des Ergebnisses korrekt wachsend.
Hier ist die Eingabe [[1, 2], [3, 4], [5]]. Jedes $item ist ein inneres array, und array_merge() hängt seine Werte an $carry an, wodurch eine einzelne flache Liste entsteht. (Dies glättet nur eine Ebene tief.)
Beispiel 5: Mehrere Arrays zu einem zusammenführen
Dieselbe Zusammenführungsidee funktioniert für das Kombinieren einer Sammlung separater arrays. Umschließen Sie die arrays, die Sie verbinden möchten, in einem äußeren array und führen Sie jedes in den Akkumulator ein.
$colors und $fruits werden der Reihe nach zusammengeführt und ergeben ein kombiniertes array. Bei vielen arrays ist dies sauberer als mehrere array_merge()-Aufrufe manuell zu verketten.
Arrow-Funktionen verwenden
Seit PHP 7.4 können Sie den Callback als prägnante Arrow-Funktion schreiben. Sie erfasst äußere Variablen automatisch und gibt ihren Ausdruck implizit zurück, wodurch das leicht zu vergessende return entfällt:
<?php
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, fn($carry, $item) => $carry + $item, 0);
echo $sum; // 15
?>Häufige Fallstricke
- Immer aus dem Callback zurückgeben. Wenn ein Codepfad vergisst,
$carryzurückzugeben, wird der Akkumulator zunullund alles danach funktioniert nicht mehr. Arrow-Funktionen umgehen dieses Problem. - Achten Sie auf den Anfangswert. Ohne
$initialbeginnt$carryalsnull. Für numerische Summen übergeben Sie0; für den Aufbau von arrays übergeben Sie[]. Andernfalls verhält sich das erstearray_merge(null, …)odernull + 1falsch oder gibt eine Warnung aus. - Leere arrays geben den Anfangswert zurück.
array_reduce([], $fn, 0)gibt0zurück; ohne Anfangswert gibt esnullzurück. Behandeln Sie diesen Fall, wenn eine leere Eingabe möglich ist. - Schlüssel werden ignoriert. Nur Werte erreichen den Callback. Reduzieren Sie über
array_keys($arr), wenn Sie sie benötigen.
Dieses Beispiel findet das Maximum ohne Anfangswert und behandelt das erste Element besonders:
<?php
$numbers = [10, 5, 20, 8];
$max = array_reduce($numbers, function ($carry, $item) {
return ($carry === null || $item > $carry) ? $item : $carry;
});
echo $max; // 20
?>Verwandte Funktionen
array_map()— jedes Element in ein neues array transformieren (eins-zu-eins), anstatt auf einen Wert zu reduzieren.array_filter()— nur die Elemente behalten, die einen Test bestehen.array_sum()— eine Abkürzung für den einfachen Summierungsfall.array_merge()— arrays direkt zusammenführen, wenn keine elementweise Logik erforderlich ist.
Fazit
array_reduce() faltet ein array auf einen einzelnen Wert, indem es einen Akkumulator durch einen Callback fädelt. Sobald Sie den ($carry, $item) => newCarry-Fluss verinnerlicht haben, können Sie mit demselben kompakten Werkzeug summieren, zählen, Lookup-Tabellen aufbauen, glätten und zusammenführen. Denken Sie an die zwei Regeln, die die meisten Fehler verhindern: immer den neuen Akkumulator zurückgeben und einen $initial-Wert wählen, der zum Typ passt, den Sie aufbauen.