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:
/* Assigning some arrays */
// Array with user defined key and value
$ArrayOne = array("UserKeyA" => "UserValueA", "UserKeyB" => "UserValueB");
// Array with auto increment key and user defined value
// as a form field would return with user input
$ArrayTwo[] = "UserValue01";
$ArrayTwo[] = "UserValue02";
// Array with auto incremented key and no value
// as a form field would return without user input
$ArrayThree[] = '';
$ArrayThree[] = '';
Po wygenerowaniu echa kluczy tablicowych i wartości dla powyższych tablic otrzymujesz:
ARRAY ONE:
[UserKeyA] => [UserValueA]
[UserKeyB] => [UserValueB]
ARRAY TWO:
[0] => [UserValue01]
[1] => [UserValue02]
TREŚĆ TRZECIA:
[0] => []
[1] => []
I testowanie powyższych tablic za pomocą empty()
zwraca następujące wyniki:
ARRAY ONE:
$ ArrayOne nie jest pusty
TABELA DRUGA: $ ArrayTwo nie jest puste
TABELA TRZECIA: $ ArrayThree nie jest pusty
Tablica zawsze będzie pusta po przypisaniu tablicy, ale nie będzie jej później używana, na przykład:
$ArrayFour = array();
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.
$EmptyTestArray = array_filter($ArrayOne);
if (!empty($EmptyTestArray))
{
// do some tests on the values in $ArrayOne
}
else
{
// Likely not to need an else,
// but could return message to user "you entered nothing" etc etc
}
Uruchomienie array_filter()
wszystkich trzech przykładowych tablic (utworzonych w pierwszym bloku kodu w tej odpowiedzi) powoduje:
Tablica pierwsza : $ arrayone nie jest pusty
TABELA DRUGA: $ arraytwo nie jest pusta
ARRAY TRZY:
$ arraythree jest pusty
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()
a foreach
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.