2009-12-27 5 views
47

Пример: Я проверка существования элемента массива, как это:Как проверить, существует ли элемент массива?

if (!self::$instances[$instanceKey]) { 
    $instances[$instanceKey] = $theInstance; 
} 

Однако, я получаю эту ошибку:

Notice: Undefined index: test in /Applications/MAMP/htdocs/mysite/MyClass.php on line 16 

Конечно, первый раз, когда я хочу экземпляр , $ экземпляры не будут знать ключ. Думаю, мой чек на доступный экземпляр неверен?

ответ

86

Вы можете использовать либо конструкцию языка isset, либо функцию array_key_exists.

isset должен быть немного быстрее (как это не функция), но будет возвращать ложь, если элемент существует и имеет значение NULL.


Например, рассматривая этот массив:

$a = array(
    123 => 'glop', 
    456 => null, 
); 

И эти три испытания, опираясь на isset:

var_dump(isset($a[123])); 
var_dump(isset($a[456])); 
var_dump(isset($a[789])); 

Первый получит вас (элемент существует, и не имеет значения null)

boolean true 

Хотя второй один получит Вас (элемент существует, но равна нулю):

boolean false 

И последний получит вы (элемент не существует):

boolean false 


с другой стороны, используя 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 

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


Для таких ситуаций, как ваша, я обычно использую isset, полагая, что я никогда не бываю во втором случае ... Но выбирать, какие из них использовать теперь до вас ;-)

Например, ваш код может стать чем-то вроде этого:

if (!isset(self::$instances[$instanceKey])) { 
    $instances[$instanceKey] = $theInstance; 
} 
+0

Должен жаловаться, потому что 'isset' является typo-unsafe. Вызывается '$ form = [1 => 5]; var_dump (isset ($ from [1])); 'возвращает' false', так как '$ from' не существует, и вы даже не уведомлены' E_NOTICE'. Медленнее, но более безопасные 'array_key_exists' делают что-то для меня. – hejdav

4

Вы хотите использовать функцию array_key_exists.

6

Вы можете использовать isset() для этого самого.

$myArr = array("Name" => "Jonathan"); 
print (isset($myArr["Name"])) ? "Exists" : "Doesn't Exist" ; 
10

Для этого вы можете использовать функцию array_key_exists.

Например,

$a=array("a"=>"Dog","b"=>"Cat"); 
if (array_key_exists("a",$a)) 
    { 
    echo "Key exists!"; 
    } 
else 
    { 
    echo "Key does not exist!"; 
    } 

PS: Пример взят из here.

23

array_key_exists() является медленным по сравнению с Исеть(). Сочетание этих двух (см. Ниже код) поможет.

Он принимает преимущество производительности IsSet(), сохраняя при этом правильный результат проверки (т.е. возвращать TRUE, даже когда элемент массива является значение NULL)

if (isset($a['element']) || array_key_exists('element', $a)) { 
     //the element exists in the array. write your code here. 
} 

сравнения контрольных показателей: (извлеченный из ниже блога).

array_key_exists() only : 205 ms 
isset() only : 35ms 
isset() || array_key_exists() : 48ms 

См http://thinkofdev.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/ и http://thinkofdev.com/php-isset-and-multi-dimentional-array/

для детального обсуждения.

+0

И, * isset * также вводящий в заблуждение. Почему ключевое слово с именем «установлено» return * false *, когда на самом деле задана переменная или позиция массива, даже если она установлена ​​в значение «null»? –

+0

Самый сложный ответ! – Hafenkranich

5

В соответствии с руководством по php вы можете сделать это двумя способами. Это зависит от того, что вам нужно проверить.

Если вы хотите, чтобы проверить, существует ли данный ключ или индекс в массиве с помощью array_key_exists

<?php 
$search_array = array('first' => 1, 'second' => 4); 
if (array_key_exists('first', $search_array)) { 
echo "The 'first' element is in the array"; 
} 
?> 

Если вы хотите, чтобы проверить, если значение существует в массиве использовать in_array

<?php 
$os = array("Mac", "NT", "Irix", "Linux"); 
if (in_array("Irix", $os)) { 
echo "Got Irix"; 
} 
?> 
1

Вы также можете использовать array_keys для количества вхождений

<?php 
$array=array('1','2','6','6','6','5'); 
$i=count(array_keys($array, 6)); 
if($i>0) 
echo "Element exists in Array"; 
?> 
2

Небольшой анекдот, иллюстрирующий использование array_key_exists.

// A programmer walked through the parking lot in search of his car 
// When he neared it, he reached for his pocket to grab his array of keys 
$keyChain = array(
    'office-door' => unlockOffice(), 
    'home-key' => unlockSmallApartment(), 
    'wifes-mercedes' => unusedKeyAfterDivorce(), 
    'safety-deposit-box' => uselessKeyForEmptyBox(), 
    'rusto-old-car' => unlockOldBarrel(), 
); 

// He tried and tried but couldn't find the right key for his car 
// And so he wondered if he had the right key with him. 
// To determine this he used array_key_exists 
if (array_key_exists('rusty-old-car', $keyChain)) { 
    print('Its on the chain.'); 
} 
Смежные вопросы