Considere estos 2 ejemplos ...
$key = 'jim';
// example 1
if (isset($array[$key])) {
// ...
}
// example 2
if (array_key_exists($key, $array)) {
// ...
}
Estoy interesado en saber si alguno de estos es mejor. Siempre he usado el primero, pero he visto a muchas personas usar el segundo ejemplo en este sitio.
Entonces, ¿cuál es mejor? ¿Más rápido? Intento más claro?
php
performance
alex
fuente
fuente
isset
nunca se comportará exactamente comoarray_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.in_array
? maettig.com/1397246220in_array
esO(n)
porque verifica los valores, no las claves. Casi siempre serán más lentos a menos quen
sea extremadamente pequeño.$array[$key] === null
?Respuestas:
isset()
es más rápido, pero no es lo mismo quearray_key_exists()
.array_key_exists()
simplemente verifica si la clave existe, incluso si el valor esNULL
.Mientras
isset()
que volveráfalse
si la clave existe y el valor esNULL
.fuente
isset
no es una función de búsqueda de matriz, solo verifica la presencia de una variable en la tabla de símbolos y no iterará sobre la matriz.array_key_exists
por otro lado iterará / buscará las claves en la primera dimensión de la matriz especificada.array_key_exists()
que solo verificará si la clave está en la matriz, lo que significa que no hará una búsqueda ya que es una tabla hash.Si está interesado en algunas pruebas que he hecho recientemente:
https://stackoverflow.com/a/21759158/520857
Resumen:
fuente
Bueno, la principal diferencia es que
isset()
no volverátrue
para las claves de matriz que corresponden a un valor nulo, mientras quearray_key_exists()
sí.Ejecutar un pequeño punto de referencia muestra que
isset()
es más rápido, pero puede que no sea del todo preciso.fuente
isset($array[$i]) || $array[$i] === null
no tiene sentido porque regresarátrue
para cada caso. Nunca obtendrá falso deisset($array[$i]) || $array[$i] === null
independientemente de las entradas.Quería agregar mis 2 centavos en esta pregunta, ya que me faltaba una salida intermedia.
Como ya se dijo
isset()
, evaluará el valor de la clave para que regresefalse
si ese valor esnull
dondearray_key_exists()
solo verificará si la clave existe en la matriz.Ejecuté un punto de referencia simple usando PHP 7, los resultados mostrados son el tiempo que tardó en finalizar la iteración:
También agregué los resultados de esta función personalizada con este punto de referencia para completar:
Como se ve y ya se dijo,
isset()
es el método más rápido, pero puede devolver falso si el valor esnull
. Esto podría dar resultados no deseados y, por lo general, uno debe usararray_key_exists()
si ese es el caso.Sin embargo, hay una salida intermedia y que está utilizando
isset() || array_key_exists()
. Este código generalmente usa la función más rápidaisset()
y siisset()
devuelve falso solo se usaarray_key_exists()
para validar. Se muestra en la tabla de arriba, es tan rápido como simplemente llamarisset()
.Sí, es un poco más escribir y envolverlo en una función es más lento pero mucho más fácil. Si necesita esto para el rendimiento, la verificación de datos grandes, 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.fuente
Con Php 7 ofrece la posibilidad de utilizar el Operador de fusión nula .
Entonces ahora puede asignar un valor predeterminado en caso de que el valor sea nulo o si la clave no existe:
fuente
hay una diferencia de php.net que leerás:
Una prueba muy informal muestra
array_key_exists()
que es aproximadamente 2.5 veces más lenta queisset()
fuente
La combinación
isset()
yis_null()
dar el mejor rendimiento frente a 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 sólo devolverá false si no existe la clave, pero incluso la llave de existir y tiene un valor nulo.Script de referencia:
Crédito : http://www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/
fuente
En cuanto a "más rápido": Pruébelo (mi dinero está encendido
array_key_exists()
, pero no puedo probarlo ahora).En cuanto a "más claro en la intención":
array_key_exists()
fuente
Obviamente, el segundo ejemplo tiene una intención más clara, no hay duda al respecto. Para averiguar qué ejemplo # 1 hace, debe estar familiarizado con las idiosincrasias de inicialización variable de PHP, y luego descubrirá que funciona de manera diferente para valores nulos, y así sucesivamente.
En cuanto a cuál es más rápido, no tengo la intención de especular, ejecute cualquiera de los doscientos mil veces en su versión de PHP y lo descubrirá :)
fuente
Su código,
isset($array[$i]) || $array[$i] === null
devolverá verdadero en todos los casos, incluso si la clave no existe (y generará un aviso de índice indefinido). Para obtener el mejor rendimiento, lo que desea esif (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}
fuente
$array[$i] === null
que se ejecutará es cuando $ i existe en la matriz y tiene el valor NULL ..