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

Рассмотрим эти два примера …

$key = 'jim'; // example 1 if (isset($array[$key])) { // ... } // example 2 if (array_key_exists($key, $array)) { // ... } 

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

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

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

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

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

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

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

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% 

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

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

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

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

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

Я хотел добавить свои 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() || array_key_exists() . Этот код, как правило, использует более быструю функцию isset() и если isset() возвращает false, то для проверки следует использовать array_key_exists() . Как показано в таблице выше, это так же быстро, как просто вызов isset() .

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

Комбинация 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/

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

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

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

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

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