2012-12-16 14 views
7
$arr = array(
    'test' => array(
     'soap' => true, 
    ), 
); 

$input = 'hey'; 
if (in_array($input, $arr['test'])) { 
    echo $input . ' is apparently in the array?'; 
} 

Risultato: hey è apparentemente nell'array?in_array non ha senso

Non ha senso per me, per favore spiegate perché. E come posso risolvere questo?

risposta

11

Ecco perché true == 'hey' a causa di type juggling. Quello che stai cercando è:

if (in_array($input, $arr['test'], true)) { 

costringe un test di uguaglianza sulla base di === invece di ==.

in_array('hey', array('soap' => true)); // true 

in_array('hey', array('soap' => true), true); // false 

Per capire il tipo di giocoleria meglio si può giocare con questo:

var_dump(true == 'hey'); // true (because 'hey' evaluates to true) 

var_dump(true === 'hey'); // false (because strings and booleans are different type) 

Aggiornamento

Se vuoi sapere se una chiave di serie è impostato (piuttosto che se un valore è presente), è necessario utilizzare isset() in questo modo:

if (isset($arr['test'][$input])) { 
    // array key $input is present in $arr['test'] 
    // i.e. $arr['test']['hey'] is present 
} 

Update 2

C'è anche array_key_exists() che può testare per la serie presenza chiave; tuttavia, dovrebbe essere utilizzato solo se esiste la possibilità che il valore dell'array corrispondente possa essere null.

if (array_key_exists($input, $arr['test'])) { 
} 
+0

Ah, capisco. Sta anche cercando i valori di ogni tasto dell'array. – John

+0

@John In realtà ** solo ** guardando questi. – ComFreek

+0

@ John Ho aggiornato la risposta, nel caso steste cercando qualcos'altro. –

2

Si sta utilizzando l'array come dizionario, ma la funzione in_array deve essere utilizzata quando la si utilizza come un array. Controllare the documentation.

+0

Quindi stai dicendo che mi manca l'array, per favore ellobarate se ci sono modi più intelligenti di fare, cosa sto cercando di ottenere. – John

+0

@John 'in_array()' cerca un valore. Quindi passa attraverso ogni oggetto e lo controlla contro l'ago. Ma se non stai usando la modalità strict, 'true == 'hey'' valuterà il valore di TRUE. Vedi la mia modifica sulla risposta di Jack. – ComFreek