players
będzie albo pusta, albo rozdzielona przecinkami lista (lub pojedyncza wartość). Jak najłatwiej sprawdzić, czy jest pusty? Zakładam, że mogę to zrobić zaraz po pobraniu $gameresult
tablicy $gamerow
? W takim przypadku prawdopodobnie bardziej efektywne byłoby pominięcie eksplodowania, $playerlist
jeśli jest puste, ale ze względu na argument, w jaki sposób sprawdziłbym, czy tablica jest pusta?
$gamerow = mysql_fetch_array($gameresult);
$playerlist = explode(",", $gamerow['players']);
Odpowiedzi:
Jeśli musisz tylko sprawdzić, czy w tablicy są ŻADNE elementy
Jeśli musisz wyczyścić puste wartości przed sprawdzeniem (zazwyczaj robione w celu zapobiegania
explode
dziwnym ciągom znaków):źródło
empty()
.if(!isset($emptyarray))
jest,false
aleif(empty($emptyarray))
powracatrue
. To właśnie mnie przybiliW PHP pusta tablica jest falsey, więc nie musisz jej używać,
empty()
jak sugerowali inni.PHP
empty()
sprawdza, czy zmienna nie istnieje lub ma wartość falsey (jakarray()
,0
,null
,false
, etc).W większości przypadków po prostu chcesz to sprawdzić
!$emptyVar
. Użyj,empty($emptyVar)
jeśli zmienna mogła nie zostać ustawiona ORAZ nie będziesz wyzwalaćE_NOTICE
; IMO to ogólnie zły pomysł.źródło
Kilka przyzwoitych odpowiedzi, ale pomyślałem, że rozwinę się nieco, aby wyjaśnić jaśniej, kiedy PHP określi, czy tablica jest pusta.
Główne uwagi:
Tablica z kluczem (lub kluczami) zostanie określona przez PHP jako NIE pusta .
Ponieważ wartości tablicowe wymagają istnienia kluczy, posiadanie wartości w tablicy lub nie, nie określa, czy jest ona pusta, tylko jeśli nie ma kluczy (ORAZ dlatego nie ma wartości).
Sprawdzanie tablicy za pomocą
empty()
nie tylko informuje, czy masz wartości, czy nie, ale informuje, czy tablica jest pusta, a klucze są częścią tablicy.Zastanów się, w jaki sposób tworzysz tablicę, zanim zdecydujesz, której metody sprawdzania użyć.
EG Tablica będzie miała klucze, gdy użytkownik prześle formularz HTML, gdy każde pole formularza ma nazwę tablicy (tj
name="array[]"
.).Dla każdego pola zostanie utworzona niepusta tablica, ponieważ dla każdej tablicy pola formularza będą automatycznie zwiększane wartości klucza.
Weźmy na przykład te tablice:
Po wygenerowaniu echa kluczy tablicowych i wartości dla powyższych tablic otrzymujesz:
I testowanie powyższych tablic za pomocą
empty()
zwraca następujące wyniki:Tablica zawsze będzie pusta po przypisaniu tablicy, ale nie będzie jej później używana, na przykład:
To będzie puste, tzn. PHP zwróci PRAWDA, jeśli użyjesz
empty()
powyższego.Więc jeśli twoja tablica ma klucze - albo przez np. Nazwy wejściowe formularza lub jeśli przypisujesz je ręcznie (tj. Utwórz tablicę z nazwami kolumn bazy danych jako kluczami, ale bez wartości / danych z bazy danych), to tablica NIE będzie
empty()
.W takim przypadku możesz zapętlić tablicę w foreach, sprawdzając, czy każdy klucz ma wartość. Jest to dobra metoda, jeśli mimo to musisz uruchomić tablicę, na przykład sprawdzając klucze lub odkażając dane.
Jednak nie jest to najlepsza metoda, jeśli po prostu trzeba wiedzieć „jeśli wartości istnieją” zwraca PRAWDA lub FAŁSZ . Istnieją różne metody określania, czy tablica ma jakieś wartości, gdy wiadomo, że będzie miała klucze. Funkcja lub klasa może być najlepszym podejściem, ale jak zawsze zależy od środowiska i dokładnych wymagań, a także innych rzeczy, takich jak to, co obecnie robisz z tablicą (jeśli w ogóle).
Oto podejście, które wykorzystuje bardzo mało kodu do sprawdzenia, czy tablica ma wartości:
Użycie
array_filter()
:Iteruje każdą wartość w tablicy, przekazując ją do funkcji zwrotnej. Jeśli funkcja zwrotna zwraca wartość true, bieżąca wartość z tablicy jest zwracana do tablicy wynikowej. Klucze tablicy są zachowane.
Uruchomienie
array_filter()
wszystkich trzech przykładowych tablic (utworzonych w pierwszym bloku kodu w tej odpowiedzi) powoduje:Więc jeśli nie ma wartości, czy są klucze, czy nie, użycie
array_filter()
do utworzenia nowej tablicy, a następnie sprawdzenie, czy nowa tablica jest pusta, pokazuje, czy w oryginalnej tablicy były jakieś wartości.Nie jest idealny i nieco niechlujny, ale jeśli masz ogromną tablicę i nie musisz z niej zapętlać z jakiegokolwiek innego powodu, jest to najprostszy pod względem wymaganego kodu.
Nie mam doświadczenia w sprawdzaniu kosztów ogólnych, ale dobrze byłoby znać różnice między używaniem
array_filter()
aforeach
sprawdzaniem, czy wartość została znaleziona.Oczywiście benchmark musiałby dotyczyć różnych parametrów, małych i dużych tablic oraz gdy istnieją wartości, a nie itd.
źródło
array_filter()
count(array())==0
ma wartość false, jeśli istnieją klucze i nie ma wartości, więc to nie pomaga w sprawdzaniu tylko wartości. Twoje zdanie jest poprawne, ale wymuszasz test,count(array())
ponieważ tablica jest oczywiście pusta. Musimy sprawdzić, kiedy tablica wróciła z formularza lub gdzieś indziej, aby wiedzieć, czy jest pusta (klucze / wartości), czy po prostu ma wartości, czy niearray_filter($_FILES["documento"]['name'])
count($gamerow['players'])
będzie 0.źródło
Jeśli chcesz się upewnić, czy testowana zmienna jest jawnie pustą tablicą, możesz użyć czegoś takiego:
źródło
Jeśli chcesz wykluczyć fałszywe lub puste wiersze (np.
0 => ''
), W których użycieempty()
zakończy się niepowodzeniem, możesz spróbować:Jeśli chcesz usunąć wszystkie wartości NULL, FALSE i puste łańcuchy (
''
), ale pozostaw wartości zerowe (0
), możesz użyćstrlen
jako wywołania zwrotnego, np .:źródło
Dlaczego nikt nie powiedział tej odpowiedzi:
źródło
array()
jest tym samym.is_array
źródło
explode()
- zwraca dane typu tablicowego. Sprawdzanieempty()
to niepotrzebne wywołanie funkcji. Jak stwierdził Cobby w 2012 r.,if($detect)
To wszystko, czego potrzeba. Tego rozwiązania nie należy wdrażać dla tego zadania ani innych. Możesz argumentować, że obejmujesz sytuacje wykraczające poza zakres tego pytania, cóż, nigdy nie ma potrzeby wywoływaniaempty()
PO,is_array()
ponieważ jeśli zmienna nie jest „ustawiona”,is_array()
wygeneruje „Uwaga: Zmienna niezdefiniowana”, jeśliisset()
toempty()
jest nadmierna umiejętność, po prostu użyj Odpowiedź Cobby'ego.Przeprowadziłem test porównawczy zawarty na końcu wpisu. Aby porównać metody:
count($arr) == 0
: countempty($arr)
: pusty$arr == []
: comp(bool) $arr
: obsadai uzyskałem następujące wyniki
Różnica między pustym a rzutowaniem na wartość logiczną jest nieznaczna. Przeprowadziłem ten test wiele razy i wydają się one zasadniczo równoważne. Zawartość tablic nie wydaje się odgrywać znaczącej roli. Oba dają przeciwne wyniki, ale logiczna negacja ledwo wystarcza, aby rzucić casting do zwycięstwa przez większość czasu, więc osobiście wolę pustą ze względu na czytelność w obu przypadkach.
źródło
sizeof
który jest [nie?]empty
jeśli chcesz sprawdzić zawartość tablicy, której możesz użyć:
patrz tutaj: http://codepad.org/EORE4k7v
źródło
Moim zdaniem najprostszym sposobem dla tablicy indeksowanej byłoby po prostu:
Warunek „if” w tablicy miałby wartość true, jeśli tablica nie jest pusta, i false, jeśli tablica jest pusta . To nie dotyczy tablic asocjacyjnych.
źródło
Używam tego kodu
Należy jednak pamiętać, że jeśli tablica ma dużą liczbę kluczy, kod ten poświęci dużo czasu na ich liczenie, w porównaniu do innych odpowiedzi tutaj.
źródło
Możesz użyć,
array_filter()
który działa świetnie we wszystkich sytuacjach:źródło
źródło
Myślę, że najlepszym sposobem ustalenia, czy tablica jest pusta, czy nie, jest użycie metody count () w następujący sposób:
źródło
count()
Połączenie może zostać usunięty w całości - patrz odpowiedź Cobby użytkownika.Podjęcie najwłaściwszej decyzji wymaga znajomości jakości danych i procesów, które należy wykonać.
Jeśli zamierzasz zdyskwalifikować / zignorować / usunąć ten wiersz, najwcześniejszy punkt filtracji powinien znajdować się w zapytaniu mysql.
WHERE players IS NOT NULL
WHERE players != ''
WHERE COALESCE(players, '') != ''
WHERE players IS NOT NULL AND players != ''
Jeśli nie jesteś w 100% pewien, czy kolumna będzie istnieć w zestawie wyników, powinieneś sprawdzić, czy kolumna jest zadeklarowana. Będzie to oznaczać wywołanie
array_key_exists()
,isset()
lubempty()
na kolumnie. Nie zamierzam zawracać sobie głowy opisywaniem różnic (istnieją inne strony SO dla tego podziału, oto początek: 1 , 2 , 3 ). To powiedziawszy, jeśli nie masz całkowitej kontroli nad zestawem wyników, być może masz nadmierną pobłażliwość „elastyczności” aplikacji i powinieneś przemyśleć, czy warto mieć problem z dostępem do nieistniejących danych w kolumnie. Mówiąc skutecznie, nigdy nie powinieneś sprawdzać, czy kolumna jest zadeklarowana - a więc nigdy nie powinieneśempty()
tego robić. Jeśli ktoś to twierdziempty()
jest bardziej odpowiednie, wtedy wypierają własną opinię o ekspresyjności skryptów. Jeśli uznasz, że warunek w punkcie 5 poniżej jest niejednoznaczny, dodaj komentarz wbudowany do swojego kodu - ale nie zrobiłbym tego. Najważniejsze jest to, że wywołanie funkcji nie ma programowej korzyści.Może twoja wartość ciągu zawiera
0
, którą chcesz uznać za prawdziwą / prawidłową / niepustą? Jeśli tak, wystarczy sprawdzić, czy wartość kolumny ma długość.Tutaj jest użycie wersji demonstracyjnej
strlen()
. To wskaże, czy ciąg utworzy znaczące elementy tablicy, jeśli zostanie rozbity.Myślę, że ważne jest, aby wspomnieć, że poprzez bezwarunkowe wybuchanie, GWARANTOWANE jest wygenerowanie niepustej tablicy. Oto dowód: Demo Innymi słowy, sprawdzanie, czy tablica jest pusta, jest całkowicie bezużyteczne - za każdym razem będzie niepuste.
Jeśli Twój łańcuch NIE MOŻE zawierać wartości zerowej (ponieważ, powiedzmy, jest to plik csv składający się z identyfikatorów zaczynających się od
1
i tylko przyrostowo),if ($gamerow['players']) {
to wszystko, czego potrzebujesz - koniec historii.... ale poczekaj, co robisz po określeniu pustki tej wartości? Jeśli masz coś, co się spodziewa
$playerlist
, ale warunkowo deklarujesz tę zmienną, ryzykujesz użycie wartości z poprzedniego wiersza lub ponowne wygenerowanie Powiadomień. Czy więc musisz bezwarunkowo zadeklarować$playerlist
jako coś ? Jeśli w ciągu nie ma żadnych prawdziwych wartości, czy Twoja aplikacja korzysta z deklarowania pustej tablicy? Możliwe, że odpowiedź brzmi tak. W takim przypadku możesz upewnić się, że zmienna jest typu tablicowego, wracając do pustej tablicy - w ten sposób nie będzie miało znaczenia, jeśli wprowadzisz tę zmienną do pętli. Wszystkie poniższe deklaracje warunkowe są równoważne.$playerlist = $gamerow['players'] ? explode(',', $gamerow['players']) : [];
Dlaczego dołożyłem wszelkich starań, aby wyjaśnić to bardzo podstawowe zadanie?
źródło
źródło
$matches = preg_grep ( "/^$text (\w+)/i" , $array ) ;
aby to sprawdzić. Używamif ( count ( $matches ) > 0 )
empty()
wykonuje zbyt wiele pracy.Rozwiązałem ten problem za pomocą następującego kodu.
źródło
Wydaje się, że działa to we wszystkich przypadkach
źródło
Co powiesz na:
źródło