Categorie
PHP

isset() vs array_key_exists()

Qual’è il modo più performante per determinare se un elemento è contenuto in un array? Il seguente test ci schiarirà le idee.
A confronto ho messo la funzione isset() e la funzione array_key_exists(), la prima determina se una variabile è settata oppure è NULL, la seconda verifica che una chiave od un indice esista in un array.

Il test

<?php
/**
 * Array Vuoto
 */
$array = array();

//isset()
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
    isset ($array[$i]);
}
echo "isset() - array vuoto: " . round(microtime(TRUE)-$start,3) . '
'; //array_key_exists() $start = microtime(true); for ($i = 0; $i < 100000; $i++) { array_key_exists($i, $array); } echo "array_key_exists() - array vuoto: " . round(microtime(TRUE)-$start,3) . '
'; /** * Array Pieno */ $array = array_fill(0,100000,'speed test!'); //isset() $start = microtime(true); for ($i = 0; $i < 100000; $i++) { isset ($array[$i]); } echo "isset() - array pieno: " . round(microtime(TRUE)-$start,3) . '
'; //array_key_exists() $start = microtime(true); for ($i = 0; $i < 100000; $i++) { array_key_exists($i, $array); } echo "array_key_exists() - array pieno: " . round(microtime(TRUE)-$start,3) . '
'; ?>

Risultato:

isset() – array vuoto: 0.022
array_key_exists() – array vuoto: 0.083
isset() – array pieno: 0.014
array_key_exists() – array pieno: 0.051

PS. test eseguito su Windows XP con PHP 5.4 VC9

Il test è stato eseguito prima su un array vuoto e poi su un array popolato con 100.000 elementi. Da questo si evince:

  1. Entrambe le funzioni sono estremamente veloci, calcolando che per ogni test è stato eseguito 100.000 volte.
  2. Non vi è alcuna differenza nel lavorare con un array pieno oppure vuoto, anzi il test si è rivelato costantemente ed incredibilmente più veloce su un array pieno.
  3. isset() è 4 volte più performante di array_key_exists().

Dobbiamo tuttavia tenere presente che la funzione isset() restituirà FALSE anche se un elemento contiene valore NULL:

<?php
$array = array('test' => NULL);
var_dump(isset ($array['test']));
var_dump(array_key_exists('test', $array));
?>
boolean false
boolean true

Conclusioni

Se la nostra applicazione non ha bisogno di distinguere se una chiave esiste oppure ha valore NULL allora ci conviene utilizzare isset() che sembra essere decisamente più veloce. Nel caso in cui gli elementi dell’array possono avere NULL come valore siamo obbligati ad utilizzare array_key_exists() altrimenti corriamo il rischio di ottenere un risultato errato.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.