В чем разница между isset и array_key_exists

Есть ли разница между 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% быстрее.

Добавить комментарий