valor multidimensional index buscar array_search array php performance

multidimensional - ¿Qué es más rápido y mejor determinar si existe una clave de matriz en PHP?



buscar valor en array multidimensional php (9)

Bueno, la principal diferencia 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.

La ejecución de un pequeño punto de referencia muestra que isset() es más rápido, pero puede no ser del todo exacto.

Considere estos 2 ejemplos ...

$key = ''jim''; // example 1 if (isset($array[$key])) { // ... } // example 2 if (array_key_exists($key, $array)) { // ... }

Me interesa saber si alguno de estos es mejor. Siempre he usado el primero, pero he visto a mucha gente usar el segundo ejemplo en este sitio.

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


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 claro en la intención": array_key_exists()


La combinación de isset() y is_null() da 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 la función no solo devolverá falso si la clave no existe, sino que incluso la clave existe y tiene un valor nulo.

Script 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 : zomeoff.com/…


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.

En cuanto a lo que es más rápido, no pretendo especular, ejecute un ciclo cerrado unos cientos de miles de veces en su versión PHP y lo sabrá :)


Quería agregar mis 2 centavos a esta pregunta, ya que me faltaba una salida intermedia.

Como ya se dijo isset() evaluará el valor de la clave para que devuelva false si ese valor es null donde array_key_exists() solo comprobará si la clave existe en la matriz.

Ejecuté un punto de referencia simple usando PHP 7, los resultados que se muestran son el tiempo que tardó en finalizar 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

Agregué los resultados de esta función personalizada con este punto de referencia para completar:

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

Como ya se ha visto, isset() es el método más rápido 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 eso es usar isset() || array_key_exists() isset() || array_key_exists() Este código generalmente usa la función más rápida isset() y si isset() devuelve falso solo entonces use array_key_exists() para validar. Se muestra en la tabla anterior, es tan rápido como llamar a isset() .

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


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

https://.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%


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


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

isset () no devuelve TRUE para las claves de matriz que corresponden a un valor NULL, mientras que array_key_exists () sí lo hace.

Una prueba muy informal muestra que array_key_exists () es aproximadamente 2,5 veces más lento que isset ()


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

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

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