Как проверить, имеет ли массив элемент с указанным индексом?
Я знаю, что есть 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
. Он работает как с числовыми, так и с строковыми индексами.