Разница между isset и array_key_exists

Как сравнить следующие два вызова функций:

isset($a['key']) array_key_exists('key', $a) 

array_key_exists определенно скажу вам, существует ли ключ в массиве, тогда как isset возвращает только true если ключ / переменная существует и не является null .

 $a = array('key1' => 'フーバー', 'key2' => null); isset($a['key1']); // true array_key_exists('key1', $a); // true isset($a['key2']); // false array_key_exists('key2', $a); // true 

Есть еще одно важное различие. isset не жалуется, когда $a не существует, а array_key_exists .

Между array_key_exists и isset , хотя оба они очень быстрые [O(1)] , isset значительно быстрее. Если эта проверка происходит много тысяч раз, вы должны использовать isset .

Следует отметить, что они не идентичны, хотя – когда ключ массива существует, но значение равно null , isset вернет false а array_key_exists вернет true . Если значение может быть null , вам нужно использовать array_key_exists .

В одном предложении, если значение массива равно null , array_key_exists возвращает true, тогда как isset возвращает false .

Если вам не нужны null значения, используйте isset который быстрее, потому что это языковая конструкция, а не функция.

Основное различие при работе с массивами заключается в том, что array_key_exists возвращает true когда значение равно null , а isset возвращает false когда значение массива равно null .

См. Isset на сайте документации PHP.

Ответ на старый вопрос, поскольку здесь нет ответа на проблему с предупреждением (объяснение следует)

В принципе, в этом случае проверки наличия ключа в массиве isset

  • указывает, определено ли выражение (массив), и ключ установлен
  • нет предупреждения или ошибки, если var не определен, а не массив …
  • но возвращает false, если значение для этого ключа равно нулю

и array_key_exists

  • указывает, существует ли ключ в массиве, как следует из названия
  • но дает предупреждение, если параметр массива не является массивом

Итак, как мы проверяем, существует ли ключ, значение которого может иметь значение null в переменной

  • который может быть или не быть массивом
  • (или аналогичным образом является многомерным массивом, для которого проверка ключа происходит при значении dim 2 и dim 1, может не быть массивом для 1- го dim (и т. д.)))

без получения предупреждения, не пропуская существующего ключа, когда его значение равно нулю (что было у разработчиков PHP-разработчиков, также было бы интересным вопросом, но, безусловно, не имеющим отношения к SO). И, конечно же, мы не хотим использовать @

 isset($var[$key]); // silent but misses null values array_key_exists($key, $var); // works but warning if $var not defined/array 

Кажется, is_array должен быть вовлечен в уравнение, но он дает предупреждение, если $var не определен, поэтому это может быть решением:

 if (isset($var[$key]) || isset($var) && is_array($var) && array_key_exists($key, $var)) ... 

который, скорее всего, будет быстрее, если тесты в основном относятся к ненулевым значениям. В противном случае для массива с почти нулевыми значениями

 if (isset($var) && is_array($var) && array_key_exists($key, $var)) ... 

будет делать работу.

Функция PHP array_key_exists() определяет, существует ли конкретный ключ или числовой индекс для элемента массива. Однако, если вы хотите определить, существует ли ключ и связан со значением , PHP-язык-язык isset() может сказать вам (и что значение не равно null ). array_key_exists() не может вернуть информацию о значении ключа / индекса.

Функция isset() выполняется быстрее, проверьте http://www.php.net/manual/en/function.array-key-exists.php#82867

Дополняя (как алгебраическое любопытство) ответ @deceze с помощью оператора @ и указывая случаи, когда «лучше» использовать @ … Не лучше, если вам нужно (без журнала и) оптимизации микропроизводительности:

  • array_key_exists : true, если ключ существует в массиве;
  • isset : true если ключ / переменная существует и не имеет null [ быстрее, чем array_key_exists ];
  • @$array['key'] : true если ключ / переменная существует и не имеет значения ( null или '' или 0) ; [так медленнее?]
 $a = array('k1' => 'HELLO', 'k2' => null, 'k3' => '', 'k4' => 0); print isset($a['k1'])? "OK $a[k1].": 'NO VALUE.'; // OK print array_key_exists('k1', $a)? "OK $a[k1].": 'NO VALUE.'; // OK print @$a['k1']? "OK $a[k1].": 'NO VALUE.'; // OK // outputs OK HELLO. OK HELLO. OK HELLO. print isset($a['k2'])? "OK $a[k2].": 'NO VALUE.'; // NO print array_key_exists('k2', $a)? "OK $a[k2].": 'NO VALUE.'; // OK print @$a['k2']? "OK $a[k2].": 'NO VALUE.'; // NO // outputs NO VALUE. OK . NO VALUE. print isset($a['k3'])? "OK $a[k3].": 'NO VALUE.'; // OK print array_key_exists('k3', $a)? "OK $a[k3].": 'NO VALUE.'; // OK print @$a['k3']? "OK $a[k3].": 'NO VALUE.'; // NO // outputs OK . OK . NO VALUE. print isset($a['k4'])? "OK $a[k4].": 'NO VALUE.'; // OK print array_key_exists('k4', $a)? "OK $a[k4].": 'NO VALUE.'; // OK print @$a['k4']? "OK $a[k4].": 'NO VALUE.'; // NO // outputs OK 0. OK 0. NO VALUE 

PS: вы можете изменить / исправить / дополнить этот текст, это Wiki.

Эти два не совсем то же самое. Я не помню точных различий, но они очень хорошо очерчены в том, что быстрее и лучше определить, существует ли ключ массива в PHP? ,

Общим консенсусом, по-видимому, является использование isset, когда это возможно, потому что это языковая конструкция и, следовательно, быстрее. Однако различия следует изложить выше.