2009-03-31 18 views
116

Considere estos 2 ejemplos ...¿Qué es más rápido y mejor determinar si existe una clave de matriz en PHP?

$key = 'jim'; 

// example 1 
if (isset($array[$key])) { 
    // ... 
} 

// example 2  
if (array_key_exists($key, $array)) { 
    // ... 
} 

estoy interesado en saber si alguno de éstos son mejores. Siempre he usado el primero, pero he visto a mucha gente usar el segundo ejemplo en este sitio.

Entonces, ¿cuál es mejor? ¿Más rápido? ¿Una intención más clara?

+1

¿Has probado * qué es más rápido? – Tomalak

+0

No ejecuté ningún punto de referencia, no. ¿Debería haberlo hecho antes? – alex

+4

'isset' nunca se comportará exactamente como' array_key_exists', el ejemplo de código que supuestamente hace que se comporte de manera idéntica arroja un Aviso si la clave no existe. – deceze

Respuesta

157

isset() es más rápido, pero no es lo mismo que array_key_exists().

array_key_exists() simplemente comprueba si la clave existe, incluso si el valor es NULL.

Considerando que isset() devolverá false si la clave existe y el valor es NULL.

+0

¿Tiene recursos específicos que afirman que isset es más rápido? –

+0

También encontré que la 'alternativa' más rápida es 'issset()' por un margen significativo (20-50%). Ver http://juliusbeckmann.de/blog/php-benchmark-isset-or-array_key_exists.html, http://www.php.net/manual/en/function.array-key-exists.php#82867 o http : //www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/. Sin embargo, debe tenerse en cuenta que isset() devuelve falso si la clave existe pero el valor es NULL. –

1

En cuanto a "más rápido": Pruébalo (mi dinero está en array_key_exists(), pero no puedo probarlo ahora).

En cuanto a "más clara en el intento": array_key_exists()

+3

isset() es en realidad significativamente más rápido si no le importa el comportamiento nulo (ver http://www.randombenchmarks.com/?p=29). –

5

hay una diferencia .. de php.net podrá leer:

isset() no devuelve TRUE para gama teclas que correspondan a un valor NULL, mientras que array_key_exists() lo hace.

Una prueba muy informal muestra array_key_exists() en alrededor de 2,5 veces más lento que isset()

16

Bueno, la diferencia principal es que isset() no devolverá true para las claves de matriz que corresponden a un valor nulo, mientras que array_key_exists() sí lo hace.

Correr un small benchmark muestra que isset() es más rápido, pero puede que no sea del todo exacto.

+1

¿Se puede ejecutar el benchmark de nuevo con el más correcto "(isset ($ array [$ i]) || $ array [$ i] === null)"? – Tomalak

+0

Ah, ¿y publicarías una indicación de la diferencia de rendimiento que muestran las dos variantes? ¡Gracias! – Tomalak

+0

¿Consideró omitir las líneas '$ arraykeyexists_result []'? Eso es irrelevante en este caso. – Gumbo

0

Obviamente, el segundo ejemplo es más claro en su intención, no hay dudas al respecto. Para averiguar qué ejemplo # 1 hace, necesita estar familiarizado con las idiosincracias de inicialización de variables de PHP, y luego descubrirá que funciona de manera diferente para los valores nulos, y así sucesivamente.

cuanto a que es más rápido - no tengo la intención de especular - funcionar tanto en un bucle estrecho unos pocos cientos de miles de veces en su versión de PHP y se dará cuenta :)

-1

Su código, isset($array[$i]) || $array[$i] === null, devolverá verdadero en todos los casos, incluso si la clave no existe (y arroja un aviso de índice indefinido).Para obtener el mejor rendimiento de lo que se desea es if (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}

+0

Esta es una respuesta al comentario de Tomalak en http://stackoverflow.com/a/700264/632951 – Pacerier

+0

La única vez que '$ array [$ i] === null' se ejecutará cuando $ i exista en la matriz y tener el valor NULL .. –

21

Si usted está interesado en algunas pruebas que he hecho recientemente:

https://stackoverflow.com/a/21759158/520857

Resumen:

| Method Name        | Run time    | Difference 
========================================================================================= 
| NonExistant::noCheckingTest()   | 0.86004090309143  | +18491.315775911% 
| NonExistant::emptyTest()     | 0.0046701431274414 | +0.95346080503016% 
| NonExistant::isnullTest()    | 0.88424181938171  | +19014.461681183% 
| NonExistant::issetTest()     | 0.0046260356903076 | Fastest 
| NonExistant::arrayKeyExistsTest()  | 1.9001779556274  | +209.73055713% 
2

Combinando isset() y is_null() brinde el mejor rendimiento contra otras funciones como: array_key_exists(), isset(), isset() + array_key_exists(), is_null(), isset() + is_null(), el único problema aquí es que la función no solo devolverá falso si la clave no existe, sino que incluso la clave existe y tiene un valor nulo.

guión de referencia:

<?php 
    $a = array('a' => 4, 'e' => null) 

    $s = microtime(true); 
    for($i=0; $i<=100000; $i++) { 
    $t = (isset($a['a'])) && (is_null($a['a'])); //true 
    $t = (isset($a['f'])) && (is_null($a['f'])); //false 
    $t = (isset($a['e'])) && (is_null($a['e']));; //false 
    } 

    $e = microtime(true); 
    echo 'isset() + is_null() : ' , ($e-$s)."<br><br>"; 
?> 

crédito: http://www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/

5

que quería añadir mis 2 centavos sobre esta cuestión, ya que me estaba perdiendo un camino intermedio a cabo.

Como ya se dijo isset() evaluará el valor de la clave para que vuelva false si ese valor es null donde array_key_exists() sólo se comprobará si existe la clave de la matriz.


he corrió un punto de referencia simple usando PHP 7, los resultados que se muestran es el tiempo que se tardó en terminar la iteración:

$a = [null, true]; 

isset($a[0])       # 0.3258841 - false 
isset($a[1])       # 0.28261614 - true 
isset($a[2])       # 0.26198816 - false 

array_key_exists(0, $a)     # 0.46202087 - true 
array_key_exists(1, $a)     # 0.43063688 - true 
array_key_exists(2, $a)     # 0.37593913 - false 

isset($a[0]) || array_key_exists(0, $a) # 0.66342998 - true 
isset($a[1]) || array_key_exists(1, $a) # 0.28389215 - true 
isset($a[2]) || array_key_exists(2, $a) # 0.55677581 - false 

array_key_isset(0, $a)     # 1.17933798 - true 
array_key_isset(1, $a)     # 0.70253706 - true 
array_key_isset(2, $a)     # 1.01110005 - false 

He añadido los resultados de esta función personalizada con esta punto de referencia, así de ejecución:

function array_key_isset($k, $a){ 
    return isset($a[$k]) || array_key_exists($k, $a); 
} 

como se ve, y ya se dijo isset() es fas método de prueba pero puede devolver falso si el valor es null. Esto podría dar resultados no deseados y generalmente uno debería usar array_key_exists() si ese es el caso.

Sin embargo, hay una salida intermedia y está usando isset() || array_key_exists(). Este código es generalmente más rápido utilizando la función isset() y si isset() vuelve falsa sólo entoncesarray_key_exists() uso para validar. Se muestra en la tabla anterior, es tan rápido como llamar directamente al isset().

Sí, es un poco más escribir y ajustarlo en una función es más lento pero mucho más fácil. Si necesita esto para el rendimiento, verificando datos grandes, etc., escríbalo completo; de lo contrario, si es un uso de 1 vez, esa sobrecarga muy pequeña en la función array_key_isset() es insignificante.

Cuestiones relacionadas