Niektóre elementy w mojej tablicy są pustymi ciągami na podstawie tego, co użytkownik przesłał. Muszę usunąć te elementy. Mam to:
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
Ale to nie działa. $linksArray
wciąż ma puste elementy. Próbowałem również zrobić to z empty()
funkcją, ale wynik jest taki sam.
Odpowiedzi:
Gdy masz do czynienia z tablicą ciągów znaków, możesz po prostu użyć
array_filter()
, który wygodnie obsługuje to wszystko za Ciebie:Należy pamiętać, że jeśli nie zostanie dostarczone wywołanie zwrotne , wszystkie wpisy w tablicy równej
FALSE
(patrz konwersja na wartość logiczną ) zostaną usunięte. Więc jeśli chcesz zachować elementy, które są np. Ciągiem dokładnym'0'
, będziesz potrzebował niestandardowego wywołania zwrotnego:źródło
array_filter
powinien usunąć puste elementy. A jeśli definicja PHP pusta nie jest taka sama jak twoja definicja, możesz wypełnić opcję wywołania zwrotnego anonimową funkcją, która wyrzuca niechciane elementy. Najwyraźniej musisz mieć php 5.3 lub nowszy, aby korzystać z anonimowych połączeń zwrotnych. stackoverflow.com/questions/2412299/…false
elementów. ( php.net/manual/en/function.array-filter.php )a
drugiego czasu po prostu resetuje pierwszy.Możesz użyć
array_filter
do usunięcia pustych elementów:Jeśli masz
(int) 0
w swojej tablicy, możesz użyć następujących czynności:EDYCJA: Może twoje elementy same w sobie nie są puste, ale zawierają jedną lub więcej spacji ... Możesz użyć następujących przed użyciem
array_filter
źródło
scalar
elementy w tablicy tak. W przeciwnym razie nie możesz tego zrobić.function remove_empty($array) { return array_filter($array, function($value){return !empty($value) || $value === 0;}); }
array_map()
zrobiłem magię, bo miałem puste miejsca w tych pustych tablicach!Najpopularniejsza odpowiedź na ten temat jest absolutnie NIEPRAWIDŁOWA.
Rozważ następujący skrypt PHP:
Dlaczego to? Ponieważ łańcuch zawierający pojedynczy znak „0” również ma wartość logiczną „fałsz”, więc nawet jeśli nie jest to pusty ciąg, nadal będzie filtrowany. To byłby błąd.
Przekazywanie wbudowanej funkcji strlen jako funkcji filtrowania będzie działać, ponieważ zwraca niezerową liczbę całkowitą dla niepustego ciągu i zerową liczbę całkowitą dla pustego ciągu. Niezerowe liczby całkowite zawsze są przetwarzane na wartość logiczną, podczas gdy zerowe liczby całkowite zawsze są przekształcane na fałsz, gdy są przekształcane na wartości logiczne.
Tak więc absolutna, ostateczna, poprawna odpowiedź to:
źródło
0
,""
,null
)strlen() expects parameter 1 to be string, array given
„Jeśli nie zostanie dostarczone wywołanie zwrotne, wszystkie wpisy wejściowe równe FAŁSZ zostaną usunięte.” - http://php.net/manual/en/function.array-filter.php
źródło
źródło
Możesz po prostu zrobić
array_filter: "Jeśli nie zostanie podane wywołanie zwrotne, wszystkie wpisy wejściowe równe FAŁSZ zostaną usunięte." Oznacza to, że elementy o wartościach NULL, 0, „0”, „”, FALSE, array () również zostaną usunięte.
Druga opcja robi
który usunie elementy o wartości NULL, '' i FALSE.
Mam nadzieję że to pomoże :)
AKTUALIZACJA
Oto przykład.
Podsumowując:
źródło
źródło
false
i0
. Biorąc pod uwagę, że została opublikowana w tej samej minucie co zaakceptowana odpowiedź (która jest niebezpieczna i niepoprawna), mogę założyć, że twoje 8 głosów pozytywnych w porównaniu do odpowiedzi zaakceptowanej 649 wynika z tego, że jest to rozwiązanie jednowierszowe.array_filter()
byłoby czystszym podejściem niżforeach()
pętlatrim()
, polecamif(is_string($link) && trim($link) === '')
Kolejna linijka do usuwania pustych ("" pustych ciągów) elementów z tablicy.
Uwaga: Ten kod celowo utrzymuje
null
,0
afalse
elementy.A może najpierw chcesz przyciąć elementy tablicy:
Uwaga: ten kod usuwa również
null
ifalse
elementy.źródło
W skrócie:
To jest mój sugerowany kod:
Wyjaśnienie:
Myślę, że użycie
array_filter
jest dobre, ale niewystarczające, ponieważ wartości są podobnespace
do\n
... i trzymaj się tablicy, a to zwykle jest złe.Więc proponuję użyć mieszanki
array_filter
iarray_map
.array_map
służy do przycinania,array_filter
służy do usuwania pustych wartości,strlen
służy do zachowania0
wartości iarray_values
służy do ponownego indeksowania, jeśli zajdzie taka potrzeba.Próbki:
Wyniki:
Test online:
http://phpio.net/s/5yg0
źródło
Jeśli pracujesz z tablicą numeryczną i potrzebujesz ponownie zindeksować tablicę po usunięciu pustych elementów, użyj funkcji array_values :
Zobacz także: tablica reindeksowa PHP?
źródło
Najczęściej głosowana odpowiedź jest nieprawidłowa lub przynajmniej nie do końca prawdziwa, ponieważ OP mówi tylko o pustych ciągach. Oto dokładne wyjaśnienie:
Co oznacza pusty ?
Przede wszystkim musimy uzgodnić, co oznacza pusty . Czy chcesz odfiltrować:
$element === false
)empty()
?Jak odfiltrować wartości
Aby odfiltrować tylko puste ciągi :
Aby odfiltrować tylko ściśle fałszywe wartości, musisz użyć funkcji zwrotnej :
Oddzwanianie jest również przydatne w każdej kombinacji, w której chcesz odfiltrować wartości „falsey”, z wyjątkiem niektórych. (Na przykład filtruj wszystko
null
ifalse
itd., Pozostawiając tylko0
):Trzeci i czwarty przypadek są (w końcu dla naszych celów) równoważne, a do tego wystarczy użyć domyślnego:
źródło
null
ifalse
pozostawić 0, możesz również użyć wbudowanejstrlen
funkcji php jako oddzwaniania.Musiałem to zrobić, aby zachować wartość tablicy (ciąg) 0
źródło
źródło
Dla tablicy wielowymiarowej
źródło
źródło
źródło
Używam następującego skryptu, aby usunąć puste elementy z tablicy
źródło
Chcę po prostu stanowić alternatywę dla pętli ... również eliminując luki w kluczach ...
W moim przypadku chciałem zachować sekwencyjne klucze tablicy po zakończeniu operacji (nie tylko liczby nieparzyste, na co się gapiłem. Konfigurowanie kodu w celu wyszukiwania tylko nieparzystych kluczy wydawało mi się kruche i nieprzydatne na przyszłość.)
Szukałem czegoś takiego: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/
Kombinacja array_filter i array_slice załatwia sprawę.
$example = array_filter($example); $example = array_slice($example,0);
Nie ma pojęcia na temat wydajności ani testów porównawczych, ale działa.
źródło
wynik
źródło
źródło
Tylko jedna linia: aktualizacja (dzięki @suther):
źródło
użyj
array_filter
funkcji, aby usunąć puste wartości:źródło
Usuń puste elementy tablicy
to działa!
źródło
Zgodnie z twoją metodą, możesz po prostu złapać te elementy w innej tablicy i użyć tego w następujący sposób,
źródło
spróbuj tego ** ** Przykład
źródło
Myślę, że array_walk jest tutaj bardziej odpowiedni
Wynik:
Odciąliśmy również puste miejsca od prawidłowych wartości
Wreszcie tylko puste (Null), (Boolean False) i ('') będą uważane za puste ciągi
Jeśli chodzi o
False
to, że można go usunąć, ponieważ AFAIK użytkownik nie może przesłać wartości boolowskich.źródło
W przypadku tego typu rzeczy o wiele lepiej jest wyraźnie powiedzieć, czego chcesz, a czego nie.
Pomoże to następnemu facetowi nie dać się zaskoczyć zachowaniem
array_filter()
bez oddzwaniania. Na przykład skończyłem na tym pytaniu, ponieważ zapomniałem, czy jearray_filter()
usuwa,NULL
czy nie. Zmarnowałem czas, kiedy mogłem po prostu skorzystać z poniższego rozwiązania i otrzymać odpowiedź.Logika jest również angnostyczna w tym sensie, że kod można skopiować na inny język bez konieczności rozumienia zachowania funkcji php, na przykład
array_filter
gdy nie jest przekazywane żadne wywołanie zwrotne.W moim rozwiązaniu na pierwszy rzut oka widać, co się dzieje. Usuń warunek, aby coś zachować, lub dodaj nowy warunek, aby przefiltrować dodatkowe wartości.
Zignoruj faktyczne użycie,
array_filter()
ponieważ po prostu przekazuję mu niestandardowe wywołanie zwrotne - możesz, jeśli chcesz, wyodrębnić to do własnej funkcji. Po prostu używam go jako cukru naforeach
pętlę.Inną zaletą tego podejścia jest to, że można podzielić predykaty filtrowania na funkcję abstrakcyjną, która filtruje pojedynczą wartość na tablicę i tworzy rozwiązanie kompozycyjne.
Zobacz ten przykład i wbudowane komentarze dla danych wyjściowych.
Teraz możesz dynamicznie utworzyć funkcję o nazwie
filterer()
usingpipe()
, która zastosuje te częściowo zastosowane funkcje.źródło