Как проверить, имеет ли массив элемент в указанном индексе?

Я знаю, что существует array_key_exists (), но после чтения документации я не действительно уверен, соответствует ли это этому случаю:

У меня есть $array и $index. Теперь я хочу получить доступ к $array, но не знаю, имеет ли он индексный $index соответствия. Я не говорю об ассоциативном массиве, но простом скучном нормальном численно индексном массиве.

Есть ли безопасный способ выяснить, получил ли я действительно доступ к элементу $array с данным $index (который является целым числом!)?

PHP не может заботиться, получаю ли я доступ к массиву с индексом за пределы, и возможно просто возвращает ПУСТОЙ УКАЗАТЕЛЬ или так, но я не хочу даже пытаться кодировать грязный, таким образом, я хочу проверить, имеет ли массив ключ, или нет;-)

14
задан openfrog 8 January 2010 в 18:54
поделиться

3 ответа

Можно использовать либо языковую конструкцию 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

Потому что :

  • в двух первых случаях элемент существует -- даже если он нуль во втором случае
  • и, в третьем случае, его не существует.
28
ответ дан 1 December 2019 в 07:19
поделиться

Именно для этого нужен array_key_exists . Он работает как с числовыми, так и с строковыми индексами.

1
ответ дан 1 December 2019 в 07:19
поделиться

Вы можете легко использовать isset():

if (isset($array[$index])) {
   // array index $index exists
}

И как вы уже говорили, PHP не очень добр, если вы пытаетесь получить доступ к несуществующему индексу, поэтому очень важно, чтобы вы проверили, что вы находитесь в пределах досягаемости, когда имеете дело с доступом к определенным индексам массива.

Если вы решили использовать array_key_exists(), обратите внимание, что есть тонкое различие:

isset() не возвращает TRUE для массива ключи, которые соответствуют NULL-значению, в то время как array_key_exists() делает.

8
ответ дан 1 December 2019 в 07:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: