2014-09-23 10 views
23

Ho una matrice, che voglio filtrare da una variabile esterna. La situazione è la seguente:Usa variabile esterna in array_filter

$id = '1'; 
var_dump($id); 
$foo = array_filter($bar, function($obj){ 
    if (isset($obj->foo)) { 
     var_dump($id); 
     if ($obj->foo == $id) return true; 
    } 
    return false; 
}); 

Il primo var_dump restituisce l'ID (che è impostato dinamicamente naturalmente), tuttavia, il secondo var_dump restituisce null.

Qualcuno può dirmi perché e come risolverlo?

+0

ciò che è $ bar e qual è il valore di $ bar –

+1

@NitishKumar '$ bar' normalmente è un array –

+1

@ php-dev Possiamo dire è sicuramente un array, perché non sta generando un errore PHP. Potrebbe non essere sempre ** sempre un array, a seconda del codice, ma è sicuramente un array nel caso d'uso in cui viene visualizzato l'errore descritto nell'OP – Joe

risposta

38

La variabile $id non è nel campo di applicazione della funzione. È necessario utilizzare la clausola use per rendere variabili esterne accessibili:

$foo = array_filter($bar, function($obj) use ($id) { 
    if (isset($obj->foo)) { 
     var_dump($id); 
     if ($obj->foo == $id) return true; 
    } 
    return false; 
}); 
+1

** Nota: ** Richiede PHP 5.3.x ... vedi anche http://stackoverflow.com/a/25994339/42223 – dreftymac

+1

@dreftymac 5.3 è richiesto solo per la sintassi della funzione anonima, non è specifico per l''uso' modificatore. – Barmar

+0

Hai ragione, grazie per aver chiarito questo punto. – dreftymac

5

Perché la funzione di chiusura non può vedere $id. È necessario la parola chiave use:

$foo = array_filter($bar, function($obj) use ($id) { 
6

variabile questione portata!

soluzione semplice potrebbe essere:

$id = '1'; 
var_dump($id); 
$foo = array_filter($bar, function($obj){ 
    global $id; 
    if (isset($obj->foo)) { 
     var_dump($id); 
     if ($obj->foo == $id) return true; 
    } 
    return false; 
}); 

o, a partire da PHP 5,3

$id = '1'; 
var_dump($id); 
$foo = array_filter($bar, function($obj) use ($id) { 
    if (isset($obj->foo)) { 
     var_dump($id); 
     if ($obj->foo == $id) return true; 
    } 
    return false; 
}); 

Speranza che aiuta

+1

Non penso che la prima versione funzionerebbe prima della 5.3, poiché le funzioni anonime sono state aggiunte in 5.3. In precedenza, dovevi usare la funzione 'create_function()', insieme alla dichiarazione 'global'. – Barmar