Die PHP array_filter()-Funktion: Ein umfassender Leitfaden
Die PHP-Funktion array_filter() filtert Array-Elemente anhand einer Callback-Funktion und gibt ein neues Array mit den bestandenen Elementen zurück.
array_filter() ist eine eingebaute PHP-Funktion, die ein neues array zurückgibt, das nur die Elemente des ursprünglichen Arrays enthält, die einen von Ihnen definierten Test bestehen. Sie übergeben einen Callback — eine Funktion, die true zurückgibt, um ein Element zu behalten, und false, um es zu verwerfen — und array_filter() wendet ihn auf jedes Element an.
Diese Seite erklärt, wie die Funktion funktioniert, alle drei Modi (Filtern nach Wert, nach Schlüssel oder nach beidem), den Stolperstein, über den die meisten Anfänger fallen (beibehaltene Schlüssel), und die Kurzform zum Entfernen „leerer" Werte.
Wie array_filter() funktioniert
array_filter() durchläuft das array Element für Element und ruft Ihren Callback für jedes davon auf:
- Gibt der Callback einen truthy-Wert zurück, wird das Element behalten.
- Gibt er einen falsy-Wert zurück, wird das Element verworfen.
Das ursprüngliche array wird nie verändert — array_filter() erstellt und gibt ein neues array zurück. Standardmäßig erhält der Callback den Wert des Elements (nicht den Schlüssel).
Syntax
array_filter(array $array, ?callable $callback = null, int $mode = 0): array$array— das zu filternde array.$callback— die Testfunktion. Optional: Wird sie weggelassen, wird jedes Element, das einem falsy-Wert entspricht (false,0,0.0,"","0",null,[]), entfernt.$mode— steuert, was der Callback empfängt. Entweder0(Standard, der Wert),ARRAY_FILTER_USE_KEYoderARRAY_FILTER_USE_BOTH. Siehe Filtern nach Schlüssel.
Filtern mit einem eigenen Callback
Die häufigste Verwendung ist das Filtern nach einer eigenen Bedingung. Hier behalten wir nur die geraden Zahlen:
Ausgabe:
Array ( [1] => 2 [3] => 4 [5] => 6 )Beachten Sie die Schlüssel: Die behaltenen Elemente behalten ihre ursprünglichen Schlüssel (1, 3, 5), sie werden nicht neu nummeriert. Das ist die größte Überraschung bei array_filter(). Siehe Ergebnis neu indizieren weiter unten für die Lösung.
In modernem PHP kann der Callback als kompakte Arrow-Funktion geschrieben werden:
$evenNumbers = array_filter($numbers, fn ($number) => $number % 2 === 0);Eine eingebaute Funktion als Callback verwenden
Der Callback kann jedes Callable sein, einschließlich einer eingebauten Funktion, die als Name übergeben wird. Hier behält is_numeric nur die numerischen Werte:
Ausgabe:
Array ( [0] => 1 [1] => 2 [3] => 4 [4] => 5 )Der string '2' wird behalten, weil is_numeric('2') true ist, während 'three' verworfen wird.
Leere Werte entfernen (kein Callback)
Rufen Sie array_filter() nur mit dem array auf, um alle falsy-Elemente zu entfernen — eine schnelle Möglichkeit, eine Liste optionaler Eingaben zu bereinigen:
<?php
$values = [0, 1, 2, '', '0', 'hello', null, false, []];
print_r(array_filter($values));
?>Ausgabe:
Array ( [1] => 1 [2] => 2 [5] => hello )Vorsicht: Dabei werden 0, '0' und '' entfernt, da sie falsy sind. Wenn ein buchstäblicher Wert 0 oder '0' in Ihren Daten bedeutsam ist, übergeben Sie stattdessen einen expliziten Callback, zum Beispiel fn ($v) => $v !== null.
Filtern nach Schlüssel oder nach beidem
Standardmäßig sieht der Callback nur den Wert. Übergeben Sie das Argument $mode, um das zu ändern:
ARRAY_FILTER_USE_KEY übergibt den Schlüssel an den Callback anstelle des Wertes:
<?php
$data = ['a' => 1, 'b' => 2, 'ab' => 3];
// Keep only single-letter keys
$result = array_filter($data, fn ($key) => strlen($key) === 1, ARRAY_FILTER_USE_KEY);
print_r($result);
?>Ausgabe:
Array ( [a] => 1 [b] => 2 )ARRAY_FILTER_USE_BOTH übergibt sowohl den Wert als auch den Schlüssel (Wert zuerst):
<?php
$data = ['a' => 1, 'b' => 2, 'c' => 3];
$result = array_filter($data, fn ($value, $key) => $value > 1 && $key !== 'c', ARRAY_FILTER_USE_BOTH);
print_r($result);
?>Ausgabe:
Array ( [b] => 2 )Ergebnis neu indizieren
Da array_filter() Schlüssel beibehält, kann ein indiziertes array Lücken aufweisen ([1], [3], [5]). Wenn Sie eine saubere, nullbasierte Liste benötigen — zum Beispiel vor der JSON-Kodierung als JSON-array — umschließen Sie das Ergebnis mit array_values():
<?php
$numbers = [1, 2, 3, 4, 5, 6];
$even = array_values(array_filter($numbers, fn ($n) => $n % 2 === 0));
print_r($even);
?>Ausgabe:
Array ( [0] => 2 [1] => 4 [2] => 6 )Wann array_filter() verwenden?
- Verwenden Sie
array_filter(), wenn Sie eine Teilmenge eines Arrays möchten (unerwünschte Elemente herausfiltern). - Verwenden Sie
array_map(), wenn Sie jedes Element transformieren möchten, aber die gleiche Anzahl beibehalten möchten. - Verwenden Sie
array_reduce(), wenn Sie ein array auf einen einzelnen Wert reduzieren möchten.
filter, map und reduce lassen sich gut kombinieren — zuerst filtern, dann die verbleibenden Elemente transformieren.
Fazit
array_filter() ist die idiomatische Methode, eine Teilmenge eines Arrays in PHP zu extrahieren. Denken Sie an die zwei wichtigsten Verhaltensweisen: Das ursprüngliche array bleibt unverändert, und die verbleibenden Elemente behalten ihre ursprünglichen Schlüssel (verwenden Sie array_values() zur Neuindizierung). Mit dem optionalen Callback und den Modi ARRAY_FILTER_USE_KEY / ARRAY_FILTER_USE_BOTH ermöglicht die Funktion das Filtern nach Wert, Schlüssel oder beidem. Weitere Informationen zur Arbeit mit Arrays finden Sie in der Übersicht PHP Arrays.