Рассмотрим эти 2 примера ...
$key = 'jim';
// example 1
if (isset($array[$key])) {
// ...
}
// example 2
if (array_key_exists($key, $array)) {
// ...
}
Мне интересно знать, если один из них лучше. Я всегда использовал первый, но многие люди видели второй пример на этом сайте.
Итак, что лучше? Быстрее? Более четкие намерения?
php
performance
Алекс
источник
источник
isset
никогда не будет вести себя точно так жеarray_key_exists
, пример кода, который предположительно заставляет его вести себя одинаково, выдает уведомление, если ключ не существует.in_array
? maettig.com/1397246220in_array
этоO(n)
потому , что он проверяет не значения ключей. Они почти всегда будут медленнее, если только выn
не очень малы.$array[$key] === null
?Ответы:
isset()
быстрее, но это не то же самое, чтоarray_key_exists()
.array_key_exists()
чисто проверяет, существует ли ключ, даже если значение естьNULL
.Тогда как
isset()
вернетсяfalse
если ключ существует и значение естьNULL
.источник
isset
не является функцией поиска по массиву, она только проверяет наличие переменной в таблице символов и не выполняет итерацию по массиву.array_key_exists
с другой стороны, будет выполнять итерацию / поиск ключей в первом измерении указанного массива.array_key_exists()
что проверю только, находится ли ключ в массиве, что означает, что он не будет выполнять поиск, поскольку это хеш-таблица.Если вы заинтересованы в некоторых тестах, которые я сделал недавно:
https://stackoverflow.com/a/21759158/520857
Резюме:
источник
Ну, главное отличие в том, что
isset()
не будет возвращатьсяtrue
для ключей массива, которые соответствуют нулевому значению, аarray_key_exists()
делает.Выполнение небольшого теста показывает, что
isset()
это быстрее, но может быть не совсем точно.источник
isset($array[$i]) || $array[$i] === null
не имеет смысла, потому что он вернетсяtrue
для каждого случая. Вы никогда не ошибетесьisset($array[$i]) || $array[$i] === null
независимо от входных данных.Я хотел добавить свои 2 цента по этому вопросу, так как мне не хватало среднего пути.
Как уже было сказано,
isset()
будет оцениваться значение ключа, поэтому он вернется,false
если это значение будетnull
гдеarray_key_exists()
, только проверит, существует ли ключ в массиве.Я выполнил простой тест с использованием PHP 7, показанный результат - это время, которое потребовалось для завершения итерации:
Я добавил результаты этой пользовательской функции в этот тест, а также для завершения:
Как видно и уже сказано,
isset()
это самый быстрый метод, но он может вернуть false, если значение равноnull
. Это может дать нежелательные результаты, и обычно следует использовать,array_key_exists()
если это так.Однако есть средний выход, и он использует
isset() || array_key_exists()
. Этот код, как правило, использует более быструю функцию,isset()
и еслиisset()
возвращает только ложь, используйтеarray_key_exists()
для проверки. Показанный в таблице выше, это так же быстро, как просто звонитьisset()
.Да, это немного больше, чтобы написать и обернуть его в функцию медленнее, но намного проще. Если вам это нужно для повышения производительности, проверки больших данных и т. Д., Запишите их полностью, в противном случае, если их однократное использование приводит к незначительным перегрузкам в работе
array_key_isset()
, незначительным.источник
С Php 7 дает возможность использовать Null Coalescing Operator .
Так что теперь вы можете назначить значение по умолчанию в случае, если значение равно нулю или если ключ не существует:
источник
есть разница с php.net, которую вы прочтете:
Очень неформальный тест показывает,
array_key_exists()
что он примерно в 2,5 раза медленнее, чемisset()
источник
Объединение
isset()
иis_null()
дают лучшую производительность против других функций , таких как:array_key_exists()
,isset()
,isset()
+array_key_exists()
,is_null()
,isset()
+is_null()
, единственная проблема здесь функция не будет возвращать только ложь , если ключ не существует, но даже ключ существует , и имеет нулевое значение.Контрольный скрипт:
Кредит : 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
будет возвращать true в каждом случае, даже если ключ не существует (и выдает неопределенное уведомление об индексе). Для лучшей производительности, что вы хотели быif (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}
источник
$array[$i] === null
будет выполнено, когда $ i существует в массиве и имеет значение NULL ..