array_filter($array, $callback) zwraca elementy $array, dla których $callback zwraca true (albo dowolną wartość, która zamienia się na true). Najpierw tablica, potem callback, a zachowane elementy zachowują swoje oryginalne klucze.
Klucze w wyniku to 1, 3, 5, 7: pozycje, które te wartości miały w oryginalnej tablicy. Ten szczegół ma większe znaczenie, niż się wydaje, a przedostatnia sekcja poniżej pokazuje, jak sobie z nim radzić.
Usuwanie pustych wartości z tablicy
Wywołaj array_filter bez callbacku, a usunie każdą wartość, która zamienia się na false: puste stringi, null, false, 0, "0" i puste tablice. To najszybszy sposób na uporządkowanie kawałków z explode() albo listy pól formularza.
Pierwszy wynik stracił też "0" i 0, które często są prawdziwymi danymi (ilość zero, cyfra kodu pocztowego). Gdy zero jest poprawną odpowiedzią, napisz callback sam, jak w drugim wywołaniu. Pełną listę wartości, które PHP uznaje za puste, znajdziesz na stronie empty.
Numerowanie wyniku od nowa przez array_values
Ponieważ klucze są zachowane, przefiltrowana lista może mieć luki. Pętla for od 0 trafia wtedy na brakujące klucze, a json_encode zamienia wynik w obiekt JSON zamiast tablicy. array_values() numeruje go od nowa.
Filtrowanie po kluczu z ARRAY_FILTER_USE_KEY
Trzeci argument wybiera, co dostaje callback. ARRAY_FILTER_USE_KEY przekazuje tylko klucz. ARRAY_FILTER_USE_BOTH przekazuje wartość, a potem klucz.
Aby zostawić stały, znany zestaw kluczy, array_intersect_key($config, array_flip(['db_host', 'db_port'])) robi to samo bez callbacku.
Filtrowanie tablicy wielowymiarowej
Większość prawdziwych danych to lista wierszy. Callback dostaje po jednym wierszu, więc sprawdzasz to pole, którego potrzebujesz.
Zmień $maxPrice i uruchom ponownie. Aby potem dostać same nazwy, przekaż wynik do array_column: array_column($affordable, 'name').
Filtrowanie, potem mapowanie, potem redukcja
array_filter wybiera elementy, array_map je zmienia, a array_reduce zwija tablicę do jednej wartości. array_reduce($array, $callback, $initial) wywołuje callback z bieżącą sumą i kolejnym elementem.
Dla zwykłej sumy krótsze jest array_sum($totals). array_reduce przydaje się, gdy wynikiem jest coś innego: string, liczba na grupę, największy wiersz.
Częsty błąd: zmiana wartości w array_filter
Wartość zwracana przez callback decyduje tylko o tym, czy element zostaje. Wszystko inne, co callback obliczy, jest wyrzucane, więc ten kod niczego nie przycina:
Przekształcaj przez array_map, potem filtruj, a gdy potrzebujesz czystej listy, dodaj array_values.
Najczęściej zadawane pytania
Jak usunąć puste wartości z tablicy w PHP?
Wywołaj array_filter($array) bez callbacku: odrzuca każdą wartość traktowaną jak fałsz ("", null, false, 0, "0", []). Aby odrzucić tylko puste stringi i null, a zostawić 0, przekaż callback: array_filter($array, fn($v) => $v !== '' && $v !== null).
Dlaczego array_filter zachowuje stare klucze?
array_filter nigdy nie numeruje od nowa: zachowane elementy zostają pod swoimi oryginalnymi kluczami, więc lista może wrócić jako [0 => 'a', 2 => 'c']. Otocz wynik przez array_values(), aby znów dostać 0, 1, 2; dzięki temu json_encode utworzy tablicę JSON zamiast obiektu.
Jak filtrować tablicę po kluczu w PHP?
Przekaż ARRAY_FILTER_USE_KEY jako trzeci argument, a callback dostanie klucz zamiast wartości: array_filter($arr, fn($k) => str_starts_with($k, 'db_'), ARRAY_FILTER_USE_KEY). Użyj ARRAY_FILTER_USE_BOTH, aby dostać wartość i klucz.
Czym różni się array_filter od array_map?
array_filter decyduje, które elementy zostają, i zwraca je bez zmian. array_map zmienia każdy element i zwraca tyle samo elementów. Aby zrobić jedno i drugie, połącz je: array_map('strtoupper', array_filter($arr)).