Menu

array_key_exists() w PHP: czy klucz istnieje w tablicy

array_key_exists('key', $array) zwraca true, gdy tablica ma ten klucz, nawet jeśli jego wartość to null. isset($array['key']) jest szybsze, ale dla wartości null zwraca false. Poznaj różnicę, key_exists(), klucze zagnieżdżone, sprawdzanie kilku kluczy i powód, dla którego obiekty wymagają property_exists().

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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(), gdy null oznacza „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(), gdy null jest prawdziwą wartością, którą musisz odróżnić od brakującego klucza: pole JSON wysłane jako null, kolumna bazy danych z wartością NULL, opcja jawnie ustawiona na null, 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).

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ