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

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

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

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

PHP может не беспокоиться, если я получаю доступ к массиву с индексом за пределами границ и, возможно, просто возвращает NULL или так, но я не хочу даже пытаться заглушить код, поэтому я хочу проверить, имеет ли массив ключ, или нет; -)

Ответы

Ответ 1

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

Потому что:

  • в первом случае элемент существует и не 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

Потому что:

  • в двух первых случаях элемент существует - даже если он NULL во втором случае
  • и, в-третьих, его не существует.

Ответ 2

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

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

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

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

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

Ответ 3

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