2009-12-27 17 views
47

Ejemplo: Estoy comprobación de la existencia de un elemento de matriz como esta:¿Cómo verificar si existe un elemento de matriz?

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

Sin embargo, me siguen dando este error:

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

Por supuesto, la primera vez que quiere una instancia , $ instancias no conocerán la clave. Supongo que mi comprobación de la instancia disponible es incorrecta.

Respuesta

86

Puede usar la construcción de lenguaje isset, o la función array_key_exists.

isset debería ser un poco más rápido (ya que no es una función), pero volverá falso si el elemento existe y tiene el valor NULL.


Por ejemplo, teniendo en cuenta esta matriz:

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

Y esas tres pruebas, confiando en isset:

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

El primero le conseguirá (existe el elemento, y es no nulo):

boolean true 

mientras que el segundo le conseguirá (el elemento existe, pero es nulo):

boolean false 

Y el último le conseguirá (el elemento no existe):

boolean false 


Por otro lado, el uso de array_key_exists así:

var_dump(array_key_exists(123, $a)); 
var_dump(array_key_exists(456, $a)); 
var_dump(array_key_exists(789, $a)); 

se obtendría esas salidas:

boolean true 
boolean true 
boolean false 

Debido a que, en los dos primeros casos, existe el elemento - incluso si es nulo en el segundo caso. Y, por supuesto, en el tercer caso, no existe.


Para situaciones como la suya, por lo general utilizo isset, teniendo en cuenta que nunca estoy en el segundo caso ... pero la elección de cuál utilizar depende ahora de que ;-)

Por ejemplo, su código podría llegar a ser algo como esto:

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

Tengo que quejarse porque 'isset' es typo-inseguro. Llamado '$ form = [1 => 5]; var_dump (isset ($ from [1])); 'returns' false', ya que '$ from' no existe y usted ni siquiera es notificado por' E_NOTICE'. Más lento, pero más seguro 'array_key_exists' hacer las cosas por mí. – hejdav

4

Desea utilizar la función array_key_exists.

6

Puede usar isset() para esto mismo.

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

Puede usar la función array_key_exists para hacer eso.

Por ejemplo,

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

PS: Ejemplo tomado de here.

23

array_key_exists() es lento en comparación con isset(). Una combinación de estos dos (ver el código a continuación) sería útil.

Toma la ventaja de rendimiento de isset() mientras se mantiene el resultado de la comprobación correcta (es decir, devolver TRUE incluso cuando el elemento de la matriz es NULL)

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

La comparación de evaluación comparativa: (extraído de debajo de las entradas del blog).

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

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

para una discusión detallada.

+0

Y, * isset * también es engañoso. ¿Por qué una palabra clave llamada "está configurada" devuelve * falso * cuando una variable, o una posición de la matriz, está realmente configurada, incluso si está configurada como * nula *? –

+0

¡La respuesta más sofisticada! – Hafenkranich

5

De acuerdo con el manual de php puede hacerlo de dos maneras. Depende de lo que necesite verificar.

Si desea comprobar si existe el índice o clave dada en la matriz de usar 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"; 
} 
?> 

Si desea comprobar si existe un valor en una matriz utilizar in_array

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

También puede usar array_keys para el número de ocurrencias

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

Una pequeña anécdota para ilustrar el uso de 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.'); 
} 
Cuestiones relacionadas