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:
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:
- Entrambe le funzioni sono estremamente veloci, calcolando che per ogni test è stato eseguito 100.000 volte.
- 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.
isset()
è 4 volte più performante diarray_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 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.