Что быстрее и лучше определить, существует ли ключ массива в 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%
Ответ 3
Ну, главное отличие состоит в том, что isset()
не вернет true
для ключей массива, которые соответствуют нулевому значению, а array_key_exists()
делает.
Запуск небольшого теста показывает, что isset()
он быстрее, но может быть не совсем точным.
Ответ 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();}