В чем разница между isset () и array_key_exists ()?

391

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

isset($a['key'])

array_key_exists('key', $a)
  • 1
    now isset возвращает FALSE, если значение равно нулю или пусто. array_key_exists возвращает true, даже если значение индекса массива пустое. ранее isset возвращает TRUE, даже если значение индекса массива пустое, поэтому его можно использовать для проверки, существует ли ключ массива.
Теги:

9 ответов

474

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 делает.

  • 51
    Жаль, что я не понял китайский язык :)
  • 205
    @ Зацкий японец. И это просто говорит «foobar».
Показать ещё 19 комментариев
104

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

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

  • 13
    не мог подчеркнуть это достаточно. просто потратил весь день на выяснение, почему выполнение сценария требует более 300 секунд. переключился на isset (), теперь выполняется менее чем за 3 секунды.
  • 18
    @celwell, я серьезно подозреваю, что у вас действительно есть другая проблема где-то еще, если простое переключение array_key_exists на isset даст вам повышение скорости на 297 секунд.
Показать ещё 7 комментариев
18

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

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

12

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

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

  • 3
    isset возвращает false и не ноль .
  • 0
    Исправлено, хотя, конечно, у deceze уже есть более полный ответ.
10

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

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

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

и array_key_exists

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

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

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

выполнит работу.

9

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

6

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

  • 1
    True, но вы должны иметь в виду, что isset() вернет false, если переменная установлена, но со значением « null »
  • 0
    sandbox.onlinephpfunctions.com/code/...
4

Дополняя (как алгебраическое любопытство) ответ @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.

  • 10
    Обратите внимание, что никогда не лучше использовать оператор @ .
  • 0
    @Bracketworks, «Никогда» (?) Это сильное слово для науки или программирования, даже для Эйнштейна или Ньютона ... Для меня это только небольшая проблема с производительностью. Я использую его, потому что это коротко сказать $x = @$_GET['x']; чем $x = array_key_exists('x',$_GET)? $_GET['x']: ''; , Посмотрите этот вопрос , чтобы решить самостоятельно.
Показать ещё 3 комментария
0

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

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

  • 1
    Разница в скорости между ними должна быть незначительной.
  • 1
    Я не уверен в больших петлях. Возможно, вы все еще правы, и мне нужно было бы сравнить, но небольшая экономия может складываться в циклы. Для большинства практических целей разница, как вы говорите, незначительна.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню