Что быстрее и лучше определить, существует ли ключ массива в PHP?

Рассмотрим эти 2 примера...

$key = 'jim';

// example 1
if (isset($array[$key])) {
    // ...
}

// example 2    
if (array_key_exists($key, $array)) {
    // ...
}

Мне интересно узнать, улучшилось ли одно из них. Я всегда использовал первый, но видел, что многие люди используют второй пример на этом сайте.

Итак, что лучше? Быстрее? Более четкое намерение?

Ответ 1

isset() работает быстрее, но это не то же самое, что array_key_exists().

array_key_exists() чисто проверяет, существует ли ключ, даже если значение NULL.

В то время как isset() вернет false, если ключ существует, а значение NULL.

Ответ 2

Если вас интересуют некоторые тесты, которые я недавно сделал:

fooobar.com/questions/20234/...

Резюме:

| Method Name                              | Run time             | Difference
=========================================================================================
| NonExistant::noCheckingTest()            | 0.86004090309143     | +18491.315775911%
| NonExistant::emptyTest()                 | 0.0046701431274414   | +0.95346080503016%
| NonExistant::isnullTest()                | 0.88424181938171     | +19014.461681183%
| NonExistant::issetTest()                 | 0.0046260356903076   | Fastest
| NonExistant::arrayKeyExistsTest()        | 1.9001779556274      | +209.73055713%

Ответ 4

Я хотел добавить свои 2 цента на этот вопрос, так как у меня отсутствовал средний выход.

Как уже говорилось, isset() будет оценивать значение ключа, чтобы он возвращал false, если это значение null, где array_key_exists() будет проверять, существует ли ключ в массиве.


Я провел простой тест с использованием PHP 7, показанные результаты - это время, необходимое для завершения итерации:

$a = [null, true];

isset($a[0])                            # 0.3258841  - false
isset($a[1])                            # 0.28261614 - true
isset($a[2])                            # 0.26198816 - false

array_key_exists(0, $a)                 # 0.46202087 - true
array_key_exists(1, $a)                 # 0.43063688 - true
array_key_exists(2, $a)                 # 0.37593913 - false

isset($a[0]) || array_key_exists(0, $a) # 0.66342998 - true
isset($a[1]) || array_key_exists(1, $a) # 0.28389215 - true
isset($a[2]) || array_key_exists(2, $a) # 0.55677581 - false

array_key_isset(0, $a)                  # 1.17933798 - true
array_key_isset(1, $a)                  # 0.70253706 - true
array_key_isset(2, $a)                  # 1.01110005 - false

Я добавил результаты этой пользовательской функции с этим эталоном для завершения:

function array_key_isset($k, $a){
    return isset($a[$k]) || array_key_exists($k, $a);
}

Как видно и уже сказано, isset() - самый быстрый метод, но он может вернуть значение false, если значение null. Это может привести к нежелательным результатам, и обычно нужно использовать array_key_exists(), если это произойдет.

Однако есть средний выход и используется isset() || array_key_exists(). Этот код обычно использует более быструю функцию isset(), и если isset() возвращает false только тогда, используйте array_key_exists() для проверки. В приведенной выше таблице это так же быстро, как прямое вызов isset().

Да, это немного больше, чтобы писать и обертывать его в функции медленнее, но намного проще. Если вам это нужно для производительности, проверки больших данных и т.д., Напишите его полностью, иначе, если его использование в 1 раз, что очень незначительные издержки в функции array_key_isset() незначительны.

Ответ 5

есть разница с php.net, которую вы прочтете:

isset() не возвращает TRUE для ключей массива, соответствующих значению NULL, в то время как array_key_exists() делает.

Очень неформальный тест показывает, что array_key_exists() примерно в 2,5 раза медленнее, чем isset()

Ответ 6

Сочетание isset() и is_null() дает лучшую производительность для других функций, таких как: array_key_exists(), isset(), isset() + array_key_exists(), is_null(), isset() + is_null(), только проблема здесь заключается в том, что функция не только вернет false, если ключ не существует, но даже ключ существует и имеет нулевое значение.

Контрольный параметр script:

<?php
  $a = array('a' => 4, 'e' => null)

  $s = microtime(true); 
  for($i=0; $i<=100000; $i++) { 
    $t = (isset($a['a'])) && (is_null($a['a'])); //true 
    $t = (isset($a['f'])) && (is_null($a['f'])); //false
    $t = (isset($a['e'])) && (is_null($a['e']));; //false 
  } 

  $e = microtime(true); 
  echo 'isset() + is_null() : ' , ($e-$s)."<br><br>";
?>

Кредит: http://www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/

Ответ 7

Что касается "быстрее": попробуйте (мои деньги находятся на array_key_exists(), но я не могу попробовать прямо сейчас).

Что касается "более четкого намерения": array_key_exists()

Ответ 8

Очевидно, что второй пример более ясен в намерениях, нет никаких сомнений в этом. Чтобы выяснить, что делает пример №1, вам нужно быть знакомым с Инициативой инициализации PHP-переменных, а затем вы обнаружите, что она работает по-разному для нулевых значений и т.д.

Что касается того, что быстрее - я не намерен спекулировать - запустите в сжатом цикле несколько сотен тысяч раз на вашей PHP-версии, и вы узнаете:)

Ответ 9

С Php 7 дает возможность использовать Null Coalescing Operator.

Нулевой оператор объединения (??) был добавлен в качестве синтаксического сахара для общего случая необходимости использования троичного в сочетании с isset(). Возвращает свой первый операнд, если он существует и не равен NULL; в противном случае он возвращает свой второй операнд.

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

$var = $array[$key] ?? 'default value'

Ответ 10

Ваш код isset($array[$i]) || $array[$i] === null вернет значение true в каждом случае, даже если ключ не существует (и дает уведомление undefined index). Для лучшей производительности вам нужно if (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}