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)).