Menu

PHP array_key_exists(): проверка наличия ключа в массиве

array_key_exists('key', $array) возвращает true, когда в массиве есть этот ключ, даже если его значение null. isset($array['key']) быстрее, но для значения null возвращает false. Разница между ними, key_exists(), вложенные ключи, проверка нескольких ключей и почему объектам нужна property_exists().

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

array_key_exists('key', $array) возвращает true, если в массиве есть этот ключ, и false, если нет. Обратите внимание на порядок: сначала ключ, потом массив. Функция возвращает true, даже когда под ключом хранится null, а именно этого isset() не делает.

Чтобы проверить значение, а не ключ, используйте in_array().

array_key_exists и isset

Обе проверяют ключ. Расходятся они, только когда значение null: isset() считает значение null "не заданным", а array_key_exists() сообщает, что в массиве действительно есть.

0 и '' для обеих считаются заданными; различает их только null. Что выбрать, зависит от того, что означает null в ваших данных:

  • Используйте isset(), когда null означает "значения нет". Это обычный случай, это языковая конструкция (немного быстрее), и она принимает вложенные пути и неопределённые переменные без предупреждения.
  • Используйте array_key_exists(), когда null это настоящее значение, которое нужно отличать от отсутствующего ключа: поле JSON, отправленное как null, столбец базы данных со значением NULL, опция, явно заданная null, чтобы её сбросить.

Другие применения isset(), включая проверку нескольких переменных сразу, описаны на странице про isset.

Отличить null от отсутствия в JSON-данных

Типичный случай, где правильный ответ даёт только array_key_exists(): API, которое обновляет запись по JSON. Поле, отправленное как null, значит "очистить", а пропущенное поле значит "не трогать". isset() видит оба случая одинаково.

С isset($patch[$field]) номер телефона остался бы, потому что null выглядел бы как отсутствующее поле.

key_exists() это та же функция

key_exists() это псевдоним array_key_exists(), оставшийся с ранних версий PHP. Те же аргументы, тот же результат. Предпочитайте полное имя, его читатели и ожидают увидеть.

Типы ключей: "1" и 1 это один ключ

Ключи массива бывают целыми числами или строками, а строка, которая является простым десятичным целым, хранится как целое. Поэтому array_key_exists('1', $arr) находит ключ 1, и наоборот. Строка вроде '01' остаётся строкой и является другим ключом.

Вложенные ключи и несколько ключей

array_key_exists() смотрит на один уровень. Для вложенного пути, где null не важен, isset($a['x']['y']) проверяет все уровни сразу. Для пути, где важен, уровни проходит небольшая вспомогательная функция. Чтобы проверить, что все несколько ключей на месте, сравнивайте через array_diff_key().

array_flip($required) превращает список имён в ключи, чтобы array_diff_key() могла сравнить их с ключами входных данных; то, что останется, и есть список недостающих полей, готовый для сообщения об ошибке.

Объектам нужна property_exists

Старые версии PHP принимали объект в array_key_exists(). PHP 8 вместо этого выбрасывает TypeError. Для объектов property_exists() проверяет объявленное или динамическое свойство (даже равное null), а isset($obj->prop) работает так же, как isset() для массивов.

Две последние строки показывают другой путь: get_object_vars() превращает доступные свойства объекта в массив, и к нему уже применимы функции для массивов.

Часто задаваемые вопросы

Почему isset возвращает false, когда array_key_exists возвращает true?

В ключе хранится null. isset($arr['k']) даёт true, только если ключ существует и его значение не null, а array_key_exists('k', $arr) даёт true всегда, когда ключ есть в массиве. Для любого другого значения, включая 0, '' и false, обе возвращают одинаковый ответ.

Что такое key_exists в PHP?

Псевдоним array_key_exists(). key_exists('id', $row) и array_key_exists('id', $row) ведут себя одинаково. В большинстве кода используют длинное имя.

Как проверить вложенный ключ в PHP?

Проверьте каждый уровень: isset($data['user']['address']['city']) проверяет весь путь сразу и не предупреждает, если какого-то уровня нет. Если значения null должны считаться присутствующими, пройдите путь через array_key_exists() уровень за уровнем.

Можно ли использовать array_key_exists для объекта?

Нет. Начиная с PHP 8.0 передача объекта выбрасывает TypeError. Для объявленных свойств используйте property_exists($obj, 'name') или isset($obj->name).

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ