Pytanie „ Jak sprawdzić, czy tablica PHP jest pusta ” sprawiło, że pomyślałem o tym pytaniu
Czy istnieje powód, którego count
należy używać zamiast empty
przy określaniu, czy tablica jest pusta, czy nie?
Moim osobistym pomysłem byłoby, gdyby 2 były równoważne w przypadku pustych tablic, których powinieneś użyć, empty
ponieważ daje logiczną odpowiedź na pytanie boolowskie. Z powyższego pytania wynika, że count($var) == 0
jest to popularna metoda. Dla mnie, chociaż technicznie poprawne, nie ma sensu. Np. P: $ var, czy jesteś pusty? Odp .: 7 . Hmmm...
Czy jest jakiś powód, dla którego powinienem użyć count == 0
zamiast tego, czy tylko kwestia osobistego gustu?
Jak zauważyli inni w komentarzach do teraz usuniętej odpowiedzi, count
będzie miał wpływ na wydajność w przypadku dużych tablic, ponieważ będzie musiał liczyć wszystkie elementy, podczas gdy empty
może zatrzymać się, gdy tylko dowie się, że nie jest pusty. Jeśli więc dają takie same wyniki w tym przypadku, ale count
są potencjalnie nieefektywne, dlaczego mielibyśmy kiedykolwiek używać count($var) == 0
?
false
w PHP - nie ma potrzeby używaniaempty()
lubcount()
.if (!$myArray) { echo "array is empty"; }
sandbox.onlinephpfunctions.com/code/…empty()
.Odpowiedzi:
Generalnie używam
empty
. Nie jestem pewien, dlaczego ludzie naprawdę używaliby count - jeśli tablica jest duża, count trwa dłużej / ma więcej narzutów. Jeśli po prostu chcesz wiedzieć, czy tablica jest pusta, użyj pustego.źródło
O(1)
, ponieważ PHP przechowuje wewnętrznie liczbę elementów. Zapoznaj się z tą odpowiedzią stackoverflow.com/a/5835419/592454Byłem ciekawy, który z nich jest tak naprawdę szybszy, więc stworzyłem prosty skrypt do testowania tych funkcji.
Ponieważ to robiłem, próbowałem również sprawdzić wydajność wykonując operacje, które normalnie byłyby powiązane z count () / empty ()
Używając PHP 5.4.39:
Korzystanie z HipHop VM 3.6.1 (dbg)
Wnioski, jeśli używasz PHP:
Empty () jest znacznie szybsza niż count () w obu scenariuszach, z pustą i wypełnioną tablicą
count () wykonuje to samo z pełną lub pustą tablicą.
Wykonywanie prostego JEŻELI lub tylko operacji logicznej jest takie samo.
IF / ELSE jest nieco bardziej wydajne niż (?:). O ile nie wykonujesz miliardów iteracji z wyrażeniami pośrodku, jest to całkowicie nieistotne.
Wnioski, jeśli używasz HHVM:
empty () jest trochę szybsze niż count (), ale nieznacznie.
[Reszta jest taka sama jak w PHP]
Podsumowując wniosek, jeśli chcesz tylko wiedzieć, czy tablica jest pusta, zawsze użyj pustego ();
To był po prostu ciekawy test, po prostu wykonany bez uwzględnienia wielu rzeczy. To tylko dowód koncepcji i może nie odzwierciedlać operacji w produkcji.
źródło
if($x){
jest szybszy niżif(empty($x)){
(działa tylko wtedy, gdy wiesz, że$x
został zadeklarowany).count
iempty
wywołuje w instrukcji if. Potem przychodziempty
i trwacount
. Ale w porównaniu do twojego w gołej obudowie, pusty jest dziesięć razy szybciej! Prosty test tablicowy: 0,104662, pusty: 0,177659, liczba: 1,175125 w PHP 5.6, w przeciwnym razie kod daje taki sam wynik w tej wersji, jak wspomniany. To tylko fałszywe wyniki.Myślę, że to tylko osobiste preferencje. Niektórzy mogą powiedzieć, że
empty
jest szybszy (np. Http://jamessocol.com/projects/count_vs_empty.php ), podczas gdy inni mogą powiedzieć, żecount
jest lepszy, ponieważ został pierwotnie stworzony dla tablic.empty
jest bardziej ogólny i można go zastosować do innych typów.php.net daje jednak następujące ostrzeżenie
count
:Innymi słowy, jeśli zmienna nie jest ustawiona, PHP dostanie powiadomienie, że jest niezdefiniowana. Dlatego przed użyciem
count
lepiej byłoby sprawdzić zmienną za pomocąisset
. Nie jest to konieczne w przypadkuempty
.źródło
count
jest to, że pierwotnie został on utworzony dla tablic ... ale obiekty mogą implementowaćCountable
, a także można przekazywać wartości skalarnecount()
i uzyskiwać poprawny wynik.isset()
punktu. Jeśli martwisz się powiadomieniami w PHP, powinieneś już zadeklarować swoją tablicę. Jeśli pozwolisz PHP dynamicznie zadeklarować twoją tablicę, otrzymasz powiadomienie w tym momencie. Myślę, że prawdziwym celem ostrzeżenia na php.net jest to, że nie powinieneś używaćcount
do określania, czy tablica została zadeklarowana, czy nie, ponieważ daje to ten sam wynik, co pusta tablica.Jest, gdy musisz coś zrobić na niepustej tablicy, znając jej rozmiar:
Ale nie polecałbym używania count, chyba że masz 100% pewności, że liczysz tablicę. Ostatnio debugowałem kod, w którym funkcja błędu zwracała
FALSE
zamiast pustej tablicy, a odkryłem:wynik:
Od tego czasu używam
empty
lub,if(array() === $array)
aby mieć pewność, że mam tablicę, która jest pusta.źródło
count()
wydaje się działać lepiej z interfejsami podobnymi do tablic, które implementująArrayAccess/Countable
.empty()
zwraca prawdę dla tego rodzaju obiektów, nawet jeśli nie mają one żadnych elementów. Zazwyczaj te klasy implementująCountable
interfejs, więc jeśli pytanie brzmi „Czy ta kolekcja zawiera elementy?” bez robienia założeń co do implementacji,count()
jest to lepsza opcja.źródło
empty
zwraca fałsz dla tego rodzaju obiektów, nawet jeśli nie mają one elementów”?count
byłoby bardziej elastycznym i rozszerzalnym rozwiązaniem, gdyby kiedykolwiek miał sens, aby Twój kod akceptował kolekcję zaimplementowaną w „powszechny” sposób… IMO to może być jedyne stosowne kryterium do określenia, czy używaszcount
lub w inny sposób ...count()
7.2 jest to, że nie może już przyjmować pustych zmiennych.Alternatywnie możesz rzutować zmienną jako wartość logiczną (niejawnie lub jawnie):
Ta metoda generuje an,
E_NOTICE
jeśli zmienna nie jest zdefiniowana, podobnie jakcount()
.Aby uzyskać więcej informacji, zobacz stronę podręcznika PHP poświęconą porównaniom typów .
źródło
empty()
wtedy, gdy jawnie próbujesz uniknąć wyzwalania E_NOTICE (co jest ogólnie złym pomysłem, IMO). Rażąco użycie pustego spowoduje błędny kod.Osobiście wolę bardziej elegancję kodowania (w odniesieniu do mojego konkretnego przypadku użycia). Zgadzam się z Danem McG, ponieważ count () nie odpowiada poprawnym typem danych (w tym przypadku logicznym) dla danego testu, zmuszając programistę do napisania większej ilości kodu w celu wypełnienia instrukcji „if”.
To, czy ma to jakikolwiek znaczący wpływ na wydajność, jest dyskusyjne tylko w przypadku bardzo dużych tablic (dla których i tak prawdopodobnie nie będziesz mieć wystarczającej ilości pamięci w większości konfiguracji).
Szczególnie jeśli chodzi o tablicę $ _POST PHP, moim zdaniem bardziej "logiczne" wydaje się pisanie / oglądanie:
źródło
Mam nadzieję, że może to komuś pomóc, nawet jeśli już udzielono odpowiedzi (i debatowaliśmy nad czym). W moim własnym scenariuszu wiem, że wszystkie moje tablice mają 7 elementów (kontrole zostały wykonane wcześniej w moim kodzie) i wykonuję operację,
array_diff
która oczywiście zwraca tablicę zerową, gdy jest równa.Miałem 34 sekundy na
count
i 17 sekund naempty
. Oba dają mi te same obliczenia, więc mój kod jest nadal w porządku.Możesz jednak wypróbować
==
lub===
jak w PHP - Sprawdź, czy dwie tablice są równe . Najlepsze, co powiedziałbym, to spróbujcount
vsempty
vs== empty array
, a potem zobacz, który daje najlepsze osiągi. W moim przypadkucount
było najwolniej więc używamempty
teraz ... będę sprawdzaćserialize
dalejźródło
Nie ma powodu, aby silna wolą
count($myArray) == 0
ponadempty($myArray)
. Mają identyczną semantykę. Niektórzy mogą uznać, że jeden jest bardziej czytelny niż drugi. Jedna może działać nieznacznie lepiej niż druga, ale prawdopodobnie nie będzie istotnym czynnikiem w większości aplikacji php. Ze wszystkich praktycznych powodów wybór jest kwestią gustu.źródło
count
gdy potrzebujesz liczyć, użyj,empty
gdy chcesz sprawdzić, czy kolekcja jest pusta. Oczywiście istnieją przypadki skrajne, takie jak łańcuchy lub wartości null, ale programista musi pomyśleć o swoim kodzie. Możesz się nie zgodzić, masz pozwolenie.Czasami użycie pustego jest koniecznością. Na przykład ten kod:
Jeśli uruchomisz ten kod w ten sposób: http://phpfiddle.org/main/code/g9x-uwi
Otrzymasz ten wynik:
Więc jeśli ty
count
puste wyjście glob, otrzymujesz zły wynik. Powinieneś sprawdzić pustkę.Z dokumentacji glob :
Sprawdź również to pytanie: Dlaczego count (false) return 1?
źródło
Ponieważ zmienna przeanalizowana jako ujemna zwróciłaby
int(1)
zcount()
wolę
($array === [] || !$array)
testować pustą tablicę.Tak, powinniśmy oczekiwać pustej tablicy, ale nie powinniśmy oczekiwać dobrej implementacji funkcji bez wymuszonych typów zwracanych.
Przykłady z
count()
źródło
Przerobiłem swój umysł, dzięki.
Ok, nie ma różnicy między używaniem
empty
acount
. Z technicznego punktucount
widzenia powinno być używane dla tablic iempty
może być używane zarówno dla tablic, jak i ciągów. Więc w większości przypadków są one wymienne i jeśli zobaczysz dokumenty php, zobaczysz listę sugestii,count
czy jesteś w tym miejscuempty
i odwrotnie.źródło