Рассмотрим эти два примера …
$key = 'jim'; // example 1 if (isset($array[$key])) { // ... } // example 2 if (array_key_exists($key, $array)) { // ... }
Мне интересно узнать, лучше ли в любом из них. Я всегда использовал первый, но видел, как многие люди используют второй пример на этом сайте.
Итак, что лучше? Быстрее? Более четкое намерение?
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();}