2014-09-23 9 views
23

Ich habe ein Array, das ich nach einer externen Variable filtern möchte. ist die Situation wie folgt:Benutze externe Variable 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; 
}); 

Die ersten var_dump liefert die ID (die natürlich dynamisch eingestellt ist), jedoch die zweite var_dump wird NULL zurückgegeben.

Kann mir jemand sagen warum und wie es zu lösen?

+0

was $ bar ist und was ist der Wert von $ bar –

+1

@NitishKumar '$ bar' normalerweise ein Array –

+1

@ php-dev Wir können sagen, Es ist definitiv ein Array, weil es keinen PHP-Fehler verursacht. Es ist vielleicht nicht immer ein Array, abhängig vom Code, aber es ist definitiv ein Array im Anwendungsfall, in dem er den Fehler in der OP – Joe

Antwort

38

Die Variable $id hilft, ist nicht in den Anwendungsbereich der Funktion. Sie müssen die use Klausel verwenden, um externe Variablen zugänglich zu machen:

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

** Hinweis: ** Erfordert PHP 5.3.x ... siehe auch http://Stackoverflow.com/a/25994339/42223 – dreftymac

+1

@dretymac 5.3 ist nur für anonyme Funktionssyntax erforderlich, es ist nicht spezifisch für die 'Verwendung' Modifikator. – Barmar

+0

Sie haben Recht, danke, dass Sie diesen Punkt erläutert haben. – dreftymac

5

Weil Ihre Schließfunktion $id nicht sehen kann. Sie benötigen das Schlüsselwort use:

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

Variable Bereich Problem!

einfache Lösung wäre:

$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; 
}); 

oder, seit 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; 
}); 

Hoffe, dass es

+1

Ich glaube nicht, dass die erste Version vor 5.3 funktionieren würde, da anonyme Funktionen in 5.3 hinzugefügt wurden. Früher müssten Sie die Funktion 'create_function()' zusammen mit der 'global' Deklaration verwenden. – Barmar

Verwandte Themen