2014-09-23 41 views
23

我有一個數組,我想通過外部變量進行過濾。 的情況如下:在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(這是動態設置ofcourse),然而,在第二var_dump返回NULL。

誰能告訴我爲什麼,以及如何解決它?

+0

什麼是$吧,什麼是$條 – 2014-09-23 11:46:40

+1

@NitishKumar'$ bar'的值通常是一個數組 – 2014-09-23 11:49:18

+1

@ PHP的開發可以說它絕對是一個數組,因爲它不會拋出PHP錯誤。它可能不會**總是**絕對是一個數組,這取決於代碼,但它絕對是一個數組,在用例中他得到了在OP – Joe 2014-09-23 11:54:03

回答

38

變量$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; 
}); 
+1

**注意:**需要PHP 5.3.x ...另請參閱http://stackoverflow.com/a/25994339/42223 – dreftymac 2017-02-06 22:05:54

+1

@dreftymac 5.3是匿名函數語法所必需的,它不是特定於'use'修改。 – Barmar 2017-02-06 22:09:42

+0

你是對的,謝謝澄清這一點。 – dreftymac 2017-02-06 22:11:02

5

因爲您的關閉功能看不到$id。您需要use關鍵字:

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

可變範圍問題!

簡單的解決方法是:

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

希望它可以幫助

+1

我不認爲第一個版本會在5.3之前工作,因爲在5.3中添加了匿名函數。此前,您必須使用'create_function()'函數以及'global'聲明。 – Barmar 2017-02-06 22:11:15