Menu

PHP array_filter(): Array nach Wert oder Schlüssel filtern

array_filter($array, $callback) behält die Elemente, für die der Callback true liefert. Hier: leere Werte entfernen, mit ARRAY_FILTER_USE_KEY nach Schlüssel filtern, das Ergebnis mit array_values neu indizieren und mit array_reduce aufsummieren.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

array_filter($array, $callback) liefert die Elemente von $array, für die $callback true liefert (oder einen Wert, der zu true wird). Das Array kommt zuerst, der Callback an zweiter Stelle, und die Elemente, die bleiben, behalten ihre ursprünglichen Schlüssel.

Die Schlüssel im Ergebnis sind 1, 3, 5, 7: die Positionen, die diese Werte im ursprünglichen Array hatten. Dieses Detail ist wichtiger, als es aussieht, und der übernächste Abschnitt zeigt, wie du damit umgehst.

Leere Werte aus einem Array entfernen

Rufe array_filter ohne Callback auf, dann entfernt es jeden Wert, der zu false wird: leere Strings, null, false, 0, "0" und leere Arrays. Das ist der schnellste Weg, die Teile eines explode() oder eine Liste von Formularfeldern aufzuräumen.

Das erste Ergebnis hat außerdem "0" und 0 verloren, die oft echte Daten sind (eine Menge von null, eine Ziffer einer Postleitzahl). Wenn null eine gültige Antwort ist, schreibst du den Callback selbst, wie im zweiten Aufruf. Die Seite zu empty hat die vollständige Liste der Werte, die PHP als leer behandelt.

Das Ergebnis mit array_values neu indizieren

Weil die Schlüssel erhalten bleiben, kann eine gefilterte Liste Lücken haben. Eine for-Schleife ab 0 trifft dann auf fehlende Schlüssel, und json_encode macht aus dem Ergebnis ein JSON-Objekt statt eines Arrays. array_values() nummeriert neu.

Mit ARRAY_FILTER_USE_KEY nach Schlüssel filtern

Das dritte Argument bestimmt, was der Callback bekommt. ARRAY_FILTER_USE_KEY übergibt nur den Schlüssel. ARRAY_FILTER_USE_BOTH übergibt den Wert und dann den Schlüssel.

Um eine feste Menge bekannter Schlüssel zu behalten, macht array_intersect_key($config, array_flip(['db_host', 'db_port'])) dasselbe ohne Callback.

Ein mehrdimensionales Array filtern

Die meisten echten Daten sind eine Liste von Zeilen. Der Callback bekommt jeweils eine Zeile, also testest du das Feld, das du brauchst.

Ändere $maxPrice und führe den Code erneut aus. Um danach nur die Namen zu bekommen, gibst du das Ergebnis an array_column: array_column($affordable, 'name').

Filtern, dann mappen, dann reduzieren

array_filter wählt Elemente aus, array_map ändert sie, und array_reduce faltet das Array zu einem Wert. array_reduce($array, $callback, $initial) ruft den Callback mit der laufenden Summe und dem nächsten Element auf.

Für eine einfache Summe ist array_sum($totals) kürzer. array_reduce lohnt sich, wenn das Ergebnis etwas anderes ist: ein String, eine Anzahl pro Gruppe, die größte Zeile.

Typischer Fehler: Werte in array_filter ändern

Der Rückgabewert des Callbacks entscheidet nur, ob ein Element bleibt. Alles andere, was er berechnet, wird verworfen, also trimmt dieser Code nichts:

Wandle mit array_map um, filtere dann und füge array_values hinzu, wenn du eine saubere Liste brauchst.

Häufig gestellte Fragen

Wie entferne ich in PHP leere Werte aus einem Array?

Rufe array_filter($array) ohne Callback auf: Es entfernt jeden falsy Wert ("", null, false, 0, "0", []). Um nur leere Strings und null zu entfernen, 0 aber zu behalten, übergibst du einen Callback: array_filter($array, fn($v) => $v !== '' && $v !== null).

Warum behält array_filter die alten Schlüssel?

array_filter nummeriert nie neu: Die behaltenen Elemente bleiben unter ihren ursprünglichen Schlüsseln, also kann eine Liste als [0 => 'a', 2 => 'c'] zurückkommen. Setze sie in array_values(), um wieder 0, 1, 2 zu bekommen; dann erzeugt json_encode auch ein JSON-Array statt eines Objekts.

Wie filtere ich in PHP ein Array nach Schlüssel?

Übergib ARRAY_FILTER_USE_KEY als drittes Argument, dann bekommt der Callback den Schlüssel statt des Werts: array_filter($arr, fn($k) => str_starts_with($k, 'db_'), ARRAY_FILTER_USE_KEY). Mit ARRAY_FILTER_USE_BOTH bekommst du Wert und Schlüssel.

Was ist der Unterschied zwischen array_filter und array_map?

array_filter entscheidet, welche Elemente bleiben, und liefert sie unverändert. array_map ändert jedes Element und liefert gleich viele Elemente. Für beides verkettest du sie: array_map('strtoupper', array_filter($arr)).

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S