2014-09-23 4 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 (जो गतिशील रूप से बिल्कुल सेट किया गया है), तथापि, दूसरा var_dump रिटर्न नल: स्थिति इस प्रकार है।

क्या कोई मुझे बता सकता है कि क्यों, और इसे कैसे हल किया जाए?

+0

$ बार क्या है और क्या $ बार –

+1

@NitishKumar '$ bar' का मूल्य सामान्य रूप से है एक सरणी –

+1

@ php-देव हम कह सकते हैं है यह निश्चित रूप से एक सरणी है, क्योंकि यह एक PHP त्रुटि फेंक नहीं है। यह कोड के आधार पर ** हमेशा ** निश्चित रूप से एक सरणी नहीं हो सकता है, लेकिन यह निश्चित रूप से उपयोग-मामले में एक सरणी है जहां उसे OP – Joe

उत्तर

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

+1

@dreftymac 5.3 केवल अज्ञात फ़ंक्शन सिंटैक्स के लिए आवश्यक है, यह 'उपयोग' के लिए विशिष्ट नहीं है संशोधक। – Barmar

+0

आप सही हैं, उस बिंदु को स्पष्ट करने के लिए धन्यवाद। – dreftymac

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

या, पीएचपी 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()' फ़ंक्शन का उपयोग करना होगा। – Barmar

संबंधित मुद्दे