php - sirve - Diferencia entre isset y array_key_exists
php isset post var (8)
Complementando (como una curiosidad algebraica) la respuesta de @deceze con el operador @
, e indicando casos donde es "mejor" usar @
... No es realmente mejor si necesita (sin registro y) optimización de micro-rendimiento:
-
array_key_exists
: es verdadero si existe una clave en una matriz; -
isset
: estrue
si la clave / variable existe y no esnull
[ más rápido que array_key_exists ]; -
@$array[''key'']
: estrue
si la clave / variable existe y no es (null
o '''' o 0) ; [mucho más lento?]
$a = array(''k1'' => ''HELLO'', ''k2'' => null, ''k3'' => '''', ''k4'' => 0);
print isset($a[''k1''])? "OK $a[k1].": ''NO VALUE.''; // OK
print array_key_exists(''k1'', $a)? "OK $a[k1].": ''NO VALUE.''; // OK
print @$a[''k1'']? "OK $a[k1].": ''NO VALUE.''; // OK
// outputs OK HELLO. OK HELLO. OK HELLO.
print isset($a[''k2''])? "OK $a[k2].": ''NO VALUE.''; // NO
print array_key_exists(''k2'', $a)? "OK $a[k2].": ''NO VALUE.''; // OK
print @$a[''k2'']? "OK $a[k2].": ''NO VALUE.''; // NO
// outputs NO VALUE. OK . NO VALUE.
print isset($a[''k3''])? "OK $a[k3].": ''NO VALUE.''; // OK
print array_key_exists(''k3'', $a)? "OK $a[k3].": ''NO VALUE.''; // OK
print @$a[''k3'']? "OK $a[k3].": ''NO VALUE.''; // NO
// outputs OK . OK . NO VALUE.
print isset($a[''k4''])? "OK $a[k4].": ''NO VALUE.''; // OK
print array_key_exists(''k4'', $a)? "OK $a[k4].": ''NO VALUE.''; // OK
print @$a[''k4'']? "OK $a[k4].": ''NO VALUE.''; // NO
// outputs OK 0. OK 0. NO VALUE
PD: puedes cambiar / corregir / complementar este texto, es un Wiki.
¿Cómo se comparan las siguientes dos funciones de llamada:
isset($a[''key''])
array_key_exists(''key'', $a)
Entre array_key_exists
y isset
, aunque ambos son muy rápidos [O(1)]
, isset
es significativamente más rápido. Si esta comprobación se realiza muchos miles de veces, querrá utilizar isset
.
Debe tenerse en cuenta que no son idénticos, sin embargo, cuando la clave de matriz existe pero el valor es null
, el isset
devolverá false
y array_key_exists
devolverá true
. Si el valor puede ser null
, debe usar array_key_exists
.
La función isset()
es más rápida, visite http://www.php.net/manual/en/function.array-key-exists.php#82867
La función PHP array_key_exists()
determina si existe una clave en particular, o un índice numérico, para un elemento de una matriz. Sin embargo, si desea determinar si una clave existe y está asociada con un valor , el lenguaje de construcción de PHP isset()
puede indicarle eso (y que el valor no es null
). array_key_exists()
no puede devolver información sobre el valor de una clave / índice.
La principal diferencia cuando se trabaja en arreglos es que array_key_exists
devuelve true
cuando el valor es null
, mientras que el isset
devolverá false
cuando el valor del arreglo se establece en null
.
Vea el isset en el sitio de documentación de PHP.
Los dos no son exactamente iguales. No podía recordar las diferencias exactas, pero se describen muy bien en ¿Qué es más rápido y mejor para determinar si existe una clave de matriz en PHP? .
El consenso común parece ser usar isset siempre que sea posible, porque es una construcción de lenguaje y, por lo tanto, más rápido. Sin embargo, las diferencias deben ser explicadas anteriormente.
array_key_exists
definitivamente te dirá si existe una clave en una matriz, mientras que isset
solo devolverá true
si la clave / variable existe y no es null
.
$a = array(''key1'' => ''フーバー'', ''key2'' => null);
isset($a[''key1'']); // true
array_key_exists(''key1'', $a); // true
isset($a[''key2'']); // false
array_key_exists(''key2'', $a); // true
Hay otra diferencia importante. isset
no se queja cuando $a
no existe, mientras que array_key_exists
sí.
Responda a una pregunta anterior , ya que aquí no hay respuesta parece abordar el problema de la "advertencia" (a continuación se explica)
Básicamente, en este caso de comprobar si existe una clave en una matriz, isset
- indica si la expresión (matriz) está definida y la clave está establecida
- no hay advertencia o error si la var no está definida, no es una matriz ...
- pero devuelve false si el valor de esa clave es nulo
y array_key_exists
- indica si existe una clave en una matriz como su nombre lo indica
- pero da una advertencia si el parámetro de matriz no es una matriz
Entonces, ¿cómo comprobamos si existe una clave cuyo valor puede ser nulo en una variable?
- que puede o no ser una matriz
- (o similarmente es una matriz multidimensional para la cual la verificación de clave ocurre en dim 2 y dim 1 el valor puede no ser una matriz para la 1ª dim (etc ...))
sin recibir una advertencia, sin perder la clave existente cuando su valor es nulo (lo que pensaban los desarrolladores de PHP también sería una pregunta interesante, pero ciertamente no es relevante en SO). Y, por supuesto, no queremos usar @
isset($var[$key]); // silent but misses null values
array_key_exists($key, $var); // works but warning if $var not defined/array
Parece que is_array
debería estar involucrado en la ecuación, pero da una advertencia si $var
no está definido, por lo que podría ser una solución:
if (isset($var[$key]) ||
isset($var) && is_array($var) && array_key_exists($key, $var)) ...
que es probable que sea más rápido si las pruebas son principalmente en valores no nulos. De lo contrario para una matriz con valores mayormente nulos
if (isset($var) && is_array($var) && array_key_exists($key, $var)) ...
Hará el trabajo.