Есть ли разница между isset() и array_key_exists()?
Да есть, и её непонимание может подложить грабли.
Разница состоит в том, что если элемент массива имеет значение null, то isset() для этого элемента вернет false, а array_key_exists() — true.
В принципе, это вполне логично, так как само название функции array_key_exists() говорит о том, что функция проверяет наличие ключа в массиве, а какое значение сопоставлено этому ключу, ее мало волнует.
Вроде бы и мелочь, но забывать об этом не стоит.
Проверяем
Ниже приведен пример кода для сравнения работы этих функций:
<?php function test($arr, $key) { $r1 = isset($arr[$key])?'T':'F'; $r2 = array_key_exists($key, $arr)?'T':'F'; echo 'Key='.$key.' | isset() = '.$r1.' | array_key_exists() = '.$r2; } $a = array( 1=>'Val1', 2=>0, 3=>null, ); test($a, 1); // Этот элемент имеет значение 'Val1' test($a, 2); // Этот элемент имеет значение 0 test($a, 3); // Этот элемент имеет значение null test($a, 4); // Такого элемента нет в массиве ?>
Результат
Key=1 | isset() = T | array_key_exists() = T Key=2 | isset() = T | array_key_exists() = T Key=3 | isset() = F | array_key_exists() = T Key=4 | isset() = F | array_key_exists() = F
Где лежат грабли?
Часто встречаю конструкции вида
if (isset($arr[$key])) unset($arr[$key]);
Вот тут и лежат грабли. Если мы попытаемся этой конструкцией удалить из массива некоторый элемент со значением null, то он не будет удален, так как isset() считеает его не установленным. Соответственно количество элементов массива также не изменится.
Стоит отметить, что тестирование производительности этих функций показало, что isset() работает примерно на 2-5% быстрее.