Я знаю, что существует array_key_exists (), но после чтения документации я не действительно уверен, соответствует ли это этому случаю:
У меня есть $array и $index. Теперь я хочу получить доступ к $array, но не знаю, имеет ли он индексный $index соответствия. Я не говорю об ассоциативном массиве, но простом скучном нормальном численно индексном массиве.
Есть ли безопасный способ выяснить, получил ли я действительно доступ к элементу $array с данным $index (который является целым числом!)?
PHP не может заботиться, получаю ли я доступ к массиву с индексом за пределы, и возможно просто возвращает ПУСТОЙ УКАЗАТЕЛЬ или так, но я не хочу даже пытаться кодировать грязный, таким образом, я хочу проверить, имеет ли массив ключ, или нет;-)
Можно использовать либо языковую конструкцию isset
, либо функцию array_key_exists
: числовой или строковый ключ не имеет значения: для PHP это все равно ассоциативный массив.
isset
должен быть немного быстрее (так как это не функция), но вернет false
, если элемент существует и имеет значение NULL
.
Например, рассматривая этот массив :
$a = array(
123 => 'glop',
456 => null,
);
И эти три теста, полагаясь на isset
:
var_dump(isset($a[123]));
var_dump(isset($a[456]));
var_dump(isset($a[789]));
Вы получите такой вывод :
boolean true
boolean false
boolean false
Because :
null
null
С другой стороны, используя array_key_exists
, как в этой части кода:
var_dump(array_key_exists(123, $a));
var_dump(array_key_exists(456, $a));
var_dump(array_key_exists(789, $a));
Вы получите этот вывод :
boolean true
boolean true
boolean false
Потому что :
нуль
во втором случае Именно для этого нужен array_key_exists
. Он работает как с числовыми, так и с строковыми индексами.
Вы можете легко использовать isset()
:
if (isset($array[$index])) {
// array index $index exists
}
И как вы уже говорили, PHP не очень добр, если вы пытаетесь получить доступ к несуществующему индексу, поэтому очень важно, чтобы вы проверили, что вы находитесь в пределах досягаемости, когда имеете дело с доступом к определенным индексам массива.
Если вы решили использовать array_key_exists()
, обратите внимание, что есть тонкое различие:
isset() не возвращает TRUE для массива ключи, которые соответствуют NULL-значению, в то время как array_key_exists() делает.