Właśnie użyłem array_filter, aby usunąć wpisy, które miały tylko wartość „” z tablicy, a teraz chcę zastosować do niej pewne przekształcenia w zależności od symbolu zastępczego zaczynającego się od 0, ale niestety nadal zachowuje oryginalny indeks. Szukałem przez chwilę i nic nie widziałem, może po prostu przegapiłem oczywistość, ale moje pytanie brzmi ...
Jak mogę łatwo zresetować indeksy tablicy tak, aby zaczynały się od 0 i przechodziły w kolejności w NOWEJ tablicy, zamiast zachowywać stare indeksy?
array_filter()
- możesz wyczyścić więcej niż zamierzasz. Oto kilka wyjaśnień z demo: stackoverflow.com/a/43657056/2943403Odpowiedzi:
Jeśli wywołasz
array_values
swoją tablicę, zostanie ona ponownie zindeksowana od zera.źródło
Jeśli używasz filtru Array, zrób to w następujący sposób
źródło
Martwię się, ilu programistów niewinnie skopiowało / wkleiło
array_values(array_filter())
metodę do swoich kodów - zastanawiam się, ilu programistów nieświadomie napotkało problemy z powodu chciwości array_filter. Albo co gorsza, ilu ludzi nigdy nie odkryło, że funkcja usuwa zbyt wiele wartości z tablicy ...Przedstawię lepszą alternatywę dla dwuczęściowego procesu usuwania
NULL
elementów z tablicy i ponownego indeksowania kluczy.Jednak po pierwsze, niezwykle ważne jest, aby podkreślić chciwość
array_filter()
i sposób, w jaki może to po cichu ćwiczyć Twój projekt. Oto tablica z mieszanymi wartościami, które ujawnią problem:Wartości puste zostaną usunięte bez względu na wielkie / małe litery.
Ale spójrz na to, co pozostaje w tablicy, gdy używamy array_values () i array_filter () :
Tablica wyjściowa (tablica $):
Teraz spójrz na to, co dostajesz z moim metoda, która używa array_walk () & is_null () , aby wygenerować nowy przefiltrowaną tablicę:
Można to napisać w wielu wierszach, aby ułatwić czytanie / wyjaśnianie:
Tablica wyjściowa ($ filter):
Dzięki mojej metodzie otrzymujesz ponownie indeksowane klucze, wszystkie wartości inne niż null i żadna z wartości null. Czysty, przenośny, niezawodny jednowarstwowy, spełniający wszystkie potrzeby macierzy w zakresie filtrowania zerowego. Oto demonstracja .
Podobnie, jeśli chcesz usunąć elementy puste, fałszywe i null (zachowując zera), te cztery metody będą działać:
lub
lub
lub
Wynik:
Wreszcie, dla każdego, kto preferuje składnię konstrukcji językowych, możesz po prostu wypchnąć wartości kwalifikujące do nowej tablicy, aby wydać nowe indeksy.
źródło
array_values(array_filter($arr, function($el) {return $el !== '';}))
? Wydaje się, że jest to naturalny sposób robienia tego, o co pyta PO.array_filter()
chyba że ich dokładna znajomość danych pozwala na zachłanne filtrowanie bez skutków ubocznych. (Kolejna uwaga:empty()
zachowuje się w ten sam sposób i zawiera również pustą tablicę w swojej chciwości.)array_filter()
zachowuje się dokładnie tak, jak można by oczekiwać na podstawie tego, co jest napisane w podręczniku: php.net/manual/en/function.array-filter.php "Jeśli nie podano wywołania zwrotnego, wszystkie wpisy tablicy są równe FALSE (zobacz konwersję na wartość logiczną ) będzie usunięty." Programiści PHP powinni mieć powszechną wiedzę, że 0, null, false, '' i '0' wszystkie przeliczane są na false, gdy są wymuszone na boolean.Zastosowanie
array_values()
:źródło