web-dev-qa-db-ja.com

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

最初 var_dumpは(動的に設定される)IDを返しますが、2番目のvar_dumpはNULLを返します。

誰がその理由と解決方法を教えてもらえますか?

35
Sander Koedood

変数$idは関数のスコープ内にありません。外部変数をアクセス可能にするには、use句を使用する必要があります。

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

可変スコープの問題!

簡単な修正は次のとおりです。

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

または、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;
});

それが役に立てば幸い

7
php-dev

あなたのクロージャー関数は$idを見ることができないからです。 useキーワードが必要です:

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