2009-03-31 13 views
116

Considerare questi 2 esempi ...Cosa è più veloce e migliore per determinare se esiste una chiave di array in PHP?

$key = 'jim'; 

// example 1 
if (isset($array[$key])) { 
    // ... 
} 

// example 2  
if (array_key_exists($key, $array)) { 
    // ... 
} 

Sono interessato a sapere se uno di questi sono migliori. Ho sempre usato il primo, ma ho visto molte persone usare il secondo esempio su questo sito.

Quindi, che è meglio? Più veloce? Intento più chiaro?

+1

Avete effettivamente * provato * che è più veloce? – Tomalak

+0

Non ho eseguito alcun benchmark, no. Dovrei avere prima di chiedere? – alex

+4

'isset' non si comporterà mai esattamente come' array_key_exists', l'esempio di codice che presumibilmente si comporta in modo identico genera un Avviso se la chiave non esiste. – deceze

risposta

157

isset() è più veloce, ma non è la stessa di array_key_exists().

array_key_exists() controlla esclusivamente se la chiave esiste, anche se il valore è NULL.

Considerando che isset() restituirà false se la chiave esiste e il valore è NULL.

+0

Hai risorse specifiche per sostenere che isset è più veloce? –

+0

Ho anche trovato che l''alternativa' più veloce è 'issset()' con un margine significativo (20-50%). Vedi http://juliusbeckmann.de/blog/php-benchmark-isset-or-array_key_exists.html, http://www.php.net/manual/en/function.array-key-exists.php#82867 o http : //www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/. Si noti tuttavia che isset() restituisce false se la chiave esiste ma il valore è NULL. –

1

Per "più veloce": Provalo (i miei soldi sono su array_key_exists(), ma non posso provarlo adesso).

Per quanto riguarda "più chiara nell'intento": array_key_exists()

+3

isset() è in realtà molto più veloce se non ti interessa il comportamento nullo (vedi http://www.randombenchmarks.com/?p=29). –

5

c'è una differenza .. da php.net potrai leggere:

isset() non restituisce TRUE per serie tasti corrispondenti a un valore NULL, mentre array_key_exists().

Un test molto informale mostra array_key_exists() è di circa 2.5 volte più lento di isset()

16

Bene, la differenza principale è che isset() non restituirà true per le chiavi dell'array che corrispondono a un valore nullo, mentre lo array_key_exists() lo fa.

L'esecuzione di un small benchmark mostra che isset() è più veloce ma potrebbe non essere del tutto preciso.

+1

È possibile eseguire nuovamente il benchmark con il più corretto "(isset ($ array [$ i]) || $ array [$ i] === null)"? – Tomalak

+0

Oh, e vorresti postare un'indicazione sulla differenza di prestazioni mostrata dalle due varianti? Grazie! – Tomalak

+0

Hai pensato di tralasciare le righe '$ arraykeyexists_result []'? Questo è irrilevante in questo caso. – Gumbo

0

Ovviamente il secondo esempio è più chiaro nell'intento, non c'è dubbio. Per capire che cosa fa l'esempio # 1, è necessario avere familiarità con le idiosincrasie di inizializzazione delle variabili di PHP - e poi scoprirai che funziona in modo diverso per valori nulli, e così via.

Per quanto riguarda che è più veloce - Non ho intenzione di speculare - funzionare sia in un loop stretto un paio di centinaia di migliaia di volte sulla vostra versione di PHP e scoprirete :)

-1

Il codice, isset($array[$i]) || $array[$i] === null, restituirà true in ogni caso, anche se la chiave non esiste (e produce un avviso indice indefinito).Per le migliori prestazioni quello che ci vuole è if (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}

+0

Questa è una risposta al commento di Tomalak su http://stackoverflow.com/a/700264/632951 – Pacerier

+0

L'unica volta che '$ array [$ i] === null' verrà eseguito è quando $ i esiste nell'array e avere il valore NULL .. –

21

Se siete interessati in alcuni test che ho fatto di recente:

https://stackoverflow.com/a/21759158/520857

Sommario:

| 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% 
2

Combinando isset() e is_null() dare la migliore prestazione contro altre funzioni come: array_key_exists(), isset(), isset() + array_key_exists(), is_null(), isset() + is_null(), l'unico problema qui è che la funzione non restituirà solo false se la chiave non esiste, ma anche la chiave esiste e ha un valore nullo.

sceneggiatura Benchmark:

<?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>"; 
?> 

credito: http://www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/

5

ho voluto aggiungere i miei 2 centesimi su questa questione, dal momento che mi mancava una via di mezzo fuori.

Come già detto isset() valuterà il valore della chiave in modo che ritorni false se tale valore è null dove array_key_exists() verificherà solo se la chiave esiste nell'array.


Ho ho fatto funzionare un punto di riferimento semplice utilizzando PHP 7, i risultati mostrati è il tempo impiegato per terminare l'iterazione:

$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 

Ho aggiunto i risultati di questa funzione personalizzata con questo punto di riferimento anche per il completamento:

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

come si è visto e già detto isset() è fas metodo di prova ma può restituire false se il valore è null. Questo potrebbe dare risultati indesiderati e di solito si dovrebbe usare array_key_exists() se questo è il caso.

Tuttavia esiste una via di mezzo e che sta utilizzando isset() || array_key_exists(). Questo codice utilizza in genere la funzione più veloce isset() e seisset() restituisce false solo utilizzare array_key_exists() per convalidare. Mostrato nella tabella sopra, è veloce come chiamare semplicemente isset().

Sì, è un po 'più da scrivere e il wrapping in una funzione è più lento ma molto più semplice. Se hai bisogno di questo per le prestazioni, controllare i big data, ecc. Scriverlo per intero, altrimenti se è un utilizzo di 1 volta che un overhead molto minore nella funzione array_key_isset() è trascurabile.

Problemi correlati