Что быстрее и лучше определить, существует ли ключ массива в PHP? - PullRequest
140 голосов
/ 31 марта 2009

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

$key = 'jim';

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

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

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

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

Ответы [ 10 ]

205 голосов
/ 31 марта 2009

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

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

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

28 голосов
/ 13 февраля 2014

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

https://stackoverflow.com/a/21759158/520857

Описание:

| 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%
18 голосов
/ 31 марта 2009

Ну, главное отличие в том, что isset() не вернет true для ключей массива, которые соответствуют нулевому значению, а array_key_exists() -.

Выполнение небольшого теста показывает, что isset() быстрее, но может быть не совсем точным.

8 голосов
/ 28 июня 2016

Я хотел добавить свои 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().

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

6 голосов
/ 31 марта 2009

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

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

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

2 голосов
/ 09 марта 2014

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

Контрольный скрипт:

<?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/

1 голос
/ 31 марта 2009

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

Что касается "яснее в намерениях": array_key_exists()

0 голосов
/ 14 мая 2019

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

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

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

$var = $array[$key] ?? 'default value'
0 голосов
/ 20 января 2012

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

0 голосов
/ 31 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...