2012-07-05 9 views
5

Ho scritto il seguente codice per verificare se un array è associativo o menoConfrontando gruppo di tasti di array associativo a intero array indicizzato

function is_associative($arr) { 
    $arr = array_keys($arr); 
    return $arr != array_keys($arr); 
} 

Si restituisce vero per gli array come:

array("a" => 5,"b" => 9); 

e false per gli array numerici

Ma non restituisce vero per gli array associativi con singolo elemento come:

array("a" =>9); 

Perché restituisce false per gli array associativi con un singolo elemento?

+1

Si dovrebbe usare 'array_diff' – alfasin

risposta

8

è necessario utilizzare !== nel confronto:

return $arr !== array_keys($arr); 

Questo genera il correct output di entrambi essere vera.

Altrimenti tipo manipola considererà i valori per la serie di elementi singolo uguali:

array(1) { [0]=> string(1) "a" } 
array(1) { [0]=> int(0) } 

Qui, "a" == 0 vale (come "a" è silenziosamente gettato a 0), ma "a" === 0 è falso.

+0

sì, questo era il problema: Grazie –

+0

Perché non sono dello stesso tipo quando si tratta di array di elementi singoli? –

+1

@JinuJD - Ho aggiornato la mia risposta con una descrizione più chiara di cosa sta succedendo – nickb