Rozważ te 2 przykłady ...
$key = 'jim';
// example 1
if (isset($array[$key])) {
// ...
}
// example 2
if (array_key_exists($key, $array)) {
// ...
}
Chciałbym wiedzieć, czy któryś z nich jest lepszy. Zawsze używałem pierwszego, ale widziałem, jak wiele osób używa drugiego przykładu na tej stronie.
Więc co jest lepsze? Szybciej? Jaśniejszy zamiar?
php
performance
Alex
źródło
źródło
isset
nigdy nie zachowa się dokładnie tak samoarray_key_exists
, przykładowy kod, który rzekomo sprawia, że zachowuje się identycznie, rzuca Notice, jeśli klucz nie istnieje.in_array
? maettig.com/1397246220in_array
toO(n)
dlatego, że nie sprawdza wartości kluczy. Prawie zawsze będą wolniejsze, chyba że twójn
jest bardzo mały.$array[$key] === null
?Odpowiedzi:
isset()
jest szybszy, ale to nie to samo coarray_key_exists()
.array_key_exists()
wyłącznie sprawdza, czy klucz istnieje, nawet jeśli wartością jestNULL
.Natomiast
isset()
zwróci,false
jeśli klucz istnieje i ma wartośćNULL
.źródło
isset
nie jest funkcją przeszukiwania tablicy, sprawdza jedynie obecność zmiennej w tablicy symboli i nie będzie iterować po tablicy.array_key_exists
z drugiej strony będzie iterować / wyszukiwać klucze w pierwszym wymiarze określonej tablicy.array_key_exists()
że sprawdzi tylko, czy klucz znajduje się w tablicy, co oznacza, że nie wykona wyszukiwania, ponieważ jest to tabela skrótów.Jeśli jesteś zainteresowany testami, które ostatnio wykonałem:
https://stackoverflow.com/a/21759158/520857
Podsumowanie:
źródło
Cóż, główna różnica polega na tym,
isset()
że nie zwracają onetrue
kluczy tablic, które odpowiadają wartości null, podczas gdyarray_key_exists()
tak.Przeprowadzenie małego testu porównawczego pokazuje,
isset()
że jest szybszy, ale może nie być całkowicie dokładny.źródło
isset($array[$i]) || $array[$i] === null
nie ma sensu, ponieważ wrócitrue
za każdym razem. Nigdy nie otrzymasz fałszuisset($array[$i]) || $array[$i] === null
niezależnie od danych wejściowych.Chciałem dodać moje 2 centy do tego pytania, ponieważ brakowało mi środkowego wyjścia.
Jak już powiedziano
isset()
, obliczy wartość klucza, więc zwróci,false
jeśli ta wartość jestnull
gdziearray_key_exists()
, sprawdzi tylko, czy klucz istnieje w tablicy.Przeprowadziłem prosty test porównawczy przy użyciu PHP 7, pokazane wyniki to czas potrzebny do zakończenia iteracji:
Dodałem wyniki tej funkcji niestandardowej do tego testu porównawczego, aby zakończyć:
Jak widać i już powiedziano,
isset()
jest najszybszą metodą, ale może zwrócić fałsz, jeśli wartość jestnull
. Może to dać niepożądane rezultaty i zwykle należy go użyć,array_key_exists()
jeśli tak jest.Jest jednak środkowe wyjście i to jest używanie
isset() || array_key_exists()
. Ten kod generalnie używa szybszej funkcjiisset()
i jeśliisset()
zwraca tylko fałsz, użyjarray_key_exists()
do walidacji. Pokazane w powyższej tabeli, jest tak samo szybkie, jak zwykłe wywołanieisset()
.Tak, trochę więcej jest pisanie, a zawijanie go w funkcję jest wolniejsze, ale o wiele łatwiejsze. Jeśli potrzebujesz tego do wydajności, sprawdzania dużych zbiorów danych itp., Zapisz go w całości, w przeciwnym razie, jeśli jest to jednorazowe użycie, bardzo niewielkie obciążenie funkcji
array_key_isset()
jest pomijalne.źródło
Z PHP 7 daje możliwość korzystania z Null Coalescing Operator .
Więc teraz możesz przypisać wartość domyślną na wypadek, gdyby wartość była pusta lub jeśli klucz nie istnieje:
źródło
istnieje różnica w stosunku do php.net, którą przeczytasz:
Bardzo nieformalny test pokazuje,
array_key_exists()
że jest około 2,5 razy wolniejszy niżisset()
źródło
Łączenie
isset()
iis_null()
daje najlepszą wydajność w stosunku do innych funkcji, takich jak:array_key_exists()
,isset()
,isset()
+array_key_exists()
,is_null()
,isset()
+is_null()
, jedynym problemem tutaj jest funkcją nie tylko return false jeśli klucz nie istnieje, ale nawet klucz istnieje i ma wartość zerową.Skrypt testowy:
Źródło : http://www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/
źródło
Co do „szybszego”: Spróbuj (moje pieniądze są włączone
array_key_exists()
, ale nie mogę tego teraz wypróbować).Co do „jaśniejszego zamiaru”:
array_key_exists()
źródło
Oczywiście drugi przykład jest jaśniejszy w zamiarze, nie ma co do tego wątpliwości. Aby dowiedzieć się, co robi przykład # 1, musisz zapoznać się z idiosynkracjami inicjalizacji zmiennych PHP - a wtedy przekonasz się, że działa on inaczej dla wartości null i tak dalej.
Co do tego, która jest szybsza - nie zamierzam spekulować - uruchom albo w ciasnej pętli kilkaset tysięcy razy na swojej wersji PHP, a przekonasz się :)
źródło
Twój kod
isset($array[$i]) || $array[$i] === null
,, zwróci wartość true w każdym przypadku, nawet jeśli klucz nie istnieje (i zwróci informację o niezdefiniowanym indeksie). Aby uzyskać najlepszą wydajność, chceszif (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}
źródło
$array[$i] === null
zostanie wykonany, gdy $ i istnieje w tablicy i ma wartość NULL ..