Как проверить, есть ли в массиве элемент по указанному индексу? - PullRequest
14 голосов
/ 08 января 2010

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

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

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

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

Ответы [ 3 ]

28 голосов
/ 08 января 2010

Вы можете использовать либо языковую конструкцию 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
  • и, в-третьих, его не существует.
8 голосов
/ 08 января 2010

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

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

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

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

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

1 голос
/ 08 января 2010

Это именно то, для чего array_key_exists. Работает как с числовыми, так и с строковыми индексами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...