array_key_exists('key', $array) zwraca true, jeśli tablica ma ten klucz, i false, jeśli go nie ma. Zwróć uwagę na kolejność: najpierw klucz, potem tablica. Zwraca true nawet wtedy, gdy wartością pod kluczem jest null, czego jako jedynego nie robi isset().
Aby sprawdzić wartość, a nie klucz, użyj in_array().
array_key_exists vs isset
Obie sprawdzają klucz. Różnią się tylko wtedy, gdy wartością jest null: isset() traktuje wartość null jako „nieustawioną”, a array_key_exists() zgłasza to, co faktycznie jest w tablicy.
0 i '' obie uznają za ustawione; rozdziela je tylko null. To, której potrzebujesz, zależy od tego, co null oznacza w twoich danych:
- Używaj
isset(), gdynulloznacza „brak wartości”. To częsty przypadek, jest to konstrukcja języka (odrobinę szybsza) i przyjmuje zagnieżdżone ścieżki oraz niezdefiniowane zmienne bez ostrzeżenia. - Używaj
array_key_exists(), gdynulljest prawdziwą wartością, którą musisz odróżnić od brakującego klucza: pole JSON wysłane jakonull, kolumna bazy danych z wartościąNULL, opcja jawnie ustawiona nanull, aby ją wyczyścić.
Strona o isset opisuje inne zastosowania, w tym sprawdzanie kilku zmiennych naraz.
Odróżnienie null od braku w danych JSON
Typowy przypadek, w którym poprawną odpowiedź daje tylko array_key_exists(): API aktualizujące rekord na podstawie JSON. Pole wysłane jako null oznacza „wyczyść je”, pole pominięte oznacza „nie ruszaj go”. isset() widzi oba przypadki tak samo.
Z isset($patch[$field]) numer telefonu by został, bo null wyglądałoby jak brakujące pole.
key_exists() to ta sama funkcja
key_exists() to alias array_key_exists(), zachowany z wczesnego PHP. Te same argumenty, ten sam wynik. Wybieraj pełną nazwę, której czytelnicy spodziewają się zobaczyć.
Typy kluczy: "1" i 1 to ten sam klucz
Klucze tablicy to liczby całkowite albo stringi, a string będący zwykłą dziesiętną liczbą całkowitą jest zapisywany jako liczba całkowita. Dlatego array_key_exists('1', $arr) znajduje klucz 1 i na odwrót. String taki jak '01' pozostaje stringiem i jest innym kluczem.
Sprawdzanie kluczy zagnieżdżonych i kilku kluczy
array_key_exists() patrzy na jeden poziom. Dla zagnieżdżonej ścieżki, w której null nie ma znaczenia, isset($a['x']['y']) sprawdza wszystkie poziomy naraz. Dla ścieżki, w której ma, krótka funkcja pomocnicza przechodzi przez poziomy. Aby sprawdzić, czy kilka kluczy jest obecnych, porównaj przez array_diff_key().
array_flip($required) zamienia listę nazw w klucze, aby array_diff_key() mogło porównać je z kluczami danych wejściowych; to, co zostaje, jest listą brakujących pól, gotową do komunikatu o błędzie.
Obiekty wymagają property_exists
Starsze PHP przyjmowało obiekt w array_key_exists(). PHP 8 zamiast tego rzuca TypeError. Dla obiektów property_exists() sprawdza zadeklarowaną lub dynamiczną właściwość (nawet ustawioną na null), a isset($obj->prop) działa jak isset() na tablicach.
Ostatnie dwie linie pokazują drugą drogę: get_object_vars() zamienia dostępne właściwości obiektu w tablicę, a wtedy działają funkcje tablicowe.
Najczęściej zadawane pytania
Dlaczego isset zwraca false, gdy array_key_exists zwraca true?
Klucz zawiera null. isset($arr['k']) daje true tylko wtedy, gdy klucz istnieje i jego wartość nie jest null, a array_key_exists('k', $arr) daje true zawsze, gdy klucz jest w tablicy. Dla każdej innej wartości, w tym 0, '' i false, obie zwracają tę samą odpowiedź.
Czym jest key_exists w PHP?
Aliasem array_key_exists(). key_exists('id', $row) i array_key_exists('id', $row) działają tak samo. Większość kodu używa dłuższej nazwy.
Jak sprawdzić, czy istnieje zagnieżdżony klucz w PHP?
Sprawdź każdy poziom: isset($data['user']['address']['city']) sprawdza całą ścieżkę naraz i nigdy nie ostrzega, gdy brakuje poziomu. Jeśli wartości null mają liczyć się jako obecne, przejdź ścieżkę przez array_key_exists() poziom po poziomie.
Czy można użyć array_key_exists na obiekcie?
Nie. Od PHP 8.0 przekazanie obiektu rzuca TypeError. Użyj property_exists($obj, 'name') dla zadeklarowanych właściwości albo isset($obj->name).