Как соотносятся следующие два вызова функций:
isset($a['key'])
array_key_exists('key', $a)
Как соотносятся следующие два вызова функций:
isset($a['key'])
array_key_exists('key', $a)
array_key_exists
определенно сообщит вам, существует ли ключ в массиве, тогда как isset
вернет true
только в 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
, который быстрее, потому что это языковая конструкция, а не функция.
Ответ на старый вопрос, поскольку здесь нет ответа на проблему с предупреждением (объяснение следует)
В принципе, в этом случае проверки наличия ключа в массиве isset
и array_key_exists
Итак, как мы проверяем, существует ли ключ, значение которого может иметь значение null в переменной
не получив предупреждения, не пропуская существующего ключа, когда его значение равно нулю (что было у разработчиков 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)) ...
выполнит работу.
Основное отличие при работе с массивами заключается в том, что array_key_exists
возвращает true
, когда значение null
, а isset
возвращает false
, когда значение массива установлено на null
.
См. isset на сайте документации PHP.
Функция 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, когда это возможно, потому что это языковая конструкция и, следовательно, быстрее. Однако различия следует изложить выше.