Как лучше производить проверку наличия ключа в массиве?

nigirma

Новичок
PHP:
$search_array = array(
    'first' => 1,
    'second' => 4
);

// Проверка существования ключа массива
// 1) Через isset
if (isset($search_array['first'])) {
    echo 'существует такой ключ';
}

// 2) Через array_key_exists
if (array_key_exists('first', $search_array)) {
    echo 'существует такой ключ';
}
Что по вашему лучше использовать? isset или array_key_exists?
 

Вурдалак

Продвинутый новичок
array_key_exists() нужен, когда требуется учитывать значения типа NULL. Если такой потребности нет, то isset().
 

Фанат

oncle terrible
Команда форума
не только
PHP:
$key = "first";
$search_array = "string";
if (isset($search_array[$key])) {
    echo 'существует такой ключ';
}
if (array_key_exists($key, $search_array)) {
    echo 'существует такой ключ';
}
 

alen

Новичок
nigirma
Действительно для проверки наличия ключа не зря придумали отдельную функцию, которой правильней пользоваться для избежания ошибок
 

alen

Новичок
Вурдалак и nigirma
Фанат, полез не в ту степь, попытался привести пример, который не проверил.
В реальности из его примера, если включить вывод изображения видно следующее:
isset($search_array[$key])
- возвращает TRUE
array_key_exists($key, $search_array)
- возвращает ошибку, в связи с тем, что $search_array не массив

В общем, как было уже сказано, правильней использовать array_key_exists, а если $search_array - может быть строкой, а не массивом, то лучше проверять например через is_array() .
 

Вурдалак

Продвинутый новичок
alen, давай ты не будешь отвечать за других. Никакого «правильно» тут нет: в зависимости от ситуации бывает полезна как isset(), так и array_key_exits().
 

Вурдалак

Продвинутый новичок
Да почти в любой. Запись короче, выполняется быстрее, почти всегда отсутствие ключа или присутствие со значением NULL имеют одинаковый смысл в логике программы.
 

nigirma

Новичок
Да почти в любой. Запись короче, выполняется быстрее, почти всегда отсутствие ключа или присутствие со значением NULL имеют одинаковый смысл в логике программы.
Мне тоже как-то удобней применять isset
Но вот уже не думал, что isset "выполняется быстрее"...
Ведь как заметил alen "не зря придумали отдельную функцию"- она создана для выполнения только этой задачи (в отличае от isset) и значит как бы должна работать быстрее. Надо будет как-нибудь на досуге проверить
 

Shumomer

Новичок
Как ни странно, но "специально созданные" функции отнюдь не всегда быстрее. Возможно это объясняется тем, что их стараются сделать максимально универсальнымим или ... дуракоустоичивыми, скажем так (т.е. в них до реальной работы стоит масса проверок). Возможно-чем-то другим, но это факт.
Вот вам пример: Выборка из массива по диапазону ключей
 

nigirma

Новичок
Как ни странно, но "специально созданные" функции отнюдь не всегда быстрее. Возможно это объясняется тем, что их стараются сделать максимально универсальнымим или ... дуракоустоичивыми, скажем так (т.е. в них до реальной работы стоит масса проверок). Возможно-чем-то другим, но это факт.
Вот вам пример: Выборка из массива по диапазону ключей
Вот туда бы еще один вариант:
PHP:
$out = array();
for($i=20;$i<26;$i++) if(array_key_exists($i, $mass)) $out[$i] = $mass[$i];
 

Shumomer

Новичок
Добавил. Прогнал тесты. Оказался чуть медленнее чем вариант с isset.
 

alen

Новичок
$key = "first";
$search_array = "string";
echo isset($search_array[$key])?1:0;
echo array_key_exists($key,$search_array)?1:0;

$key = "first";
$search_array = array("string");
echo isset($search_array[$key])?1:0;
echo array_key_exists($key,$search_array)?1:0;
Прошу обратить внимание что выводит:
echo isset($search_array[$key])?1:0;
в первом блоке, когда $search_array - не массив.

Использовать isset можно, но нужно принимать во внимание, что при некоторых обстоятельствах, она работает некорректно.
 

MiksIr

miksir@home:~$
Нормальный программист, если он не уверен, что $search_array - массив, всегда сделает is_array. А проблемы говнокодеров - это их проблемы.
 

alen

Новичок
MiksIr
А какие аргументы приведешь, если элемент массива будет равен null??
isset , исходя из документации: "Determine if a variable is set and is not NULL".
 

MiksIr

miksir@home:~$
alen
А какие аргументы приведешь, если для меня отсутствие элемента и его равенство null однозначно?
 

alen

Новичок
MiksIr
Еще раз предлагаю прочесть мои посты, я не говорил, что запрещено использование этой функции, но говорил, что она не всегда будет выдавать верный ответ.
Разговор сходится к тому, что я тебе о том, что подушки безопасности спасают жизнь, а ты мне про медленную скорость запорожца.
 
Сверху