2012-07-23 14 views
5

PHP में सरणी को संशोधित करने के लिए array_walk (और समान फ़ंक्शंस) जैसे फ़ंक्शंस का उपयोग करना PHP में कुछ शानदार फ़ंक्शन (जैसे array_walk) हैं जो आपको प्रत्येक तत्व को सरणी में संसाधित करने की अनुमति देते हैं। वे आम तौर पर स्थापित होते हैं ताकि आप उस सरणी को निर्दिष्ट कर सकें जिसे आप पहले पैरामीटर के रूप में संसाधित करना चाहते हैं और कॉलबैक फ़ंक्शन प्रत्येक तत्व को दूसरे के रूप में लागू करने के लिए निर्दिष्ट करते हैं। ये फ़ंक्शन सफलता का संकेत देने वाले बूलियन लौटते हैं, संशोधित सरणी की एक प्रति नहीं, जैसा कि आप उम्मीद कर सकते हैं। यदि आप सरणी को संशोधित करना चाहते हैं, तो आपको संदर्भ में सरणी को array_walk(&$my_array, 'my_callback');PHP> = 5.3

हालांकि, PHP 5.3 और बाद में, यदि आप फ़ंक्शन कॉल के संदर्भ में पास करते हैं तो आपको एक E_DEPRECATED त्रुटि मिलती है।

क्या किसी को पता है (यदि मौजूद है) त्रुटियों को ट्रिगर किए बिना और स्पष्ट रूप से दबाने के बिना इन कार्यों का उपयोग करने के लिए इन तरीकों का उपयोग करने का सही तरीका है? क्या इन पुरानी सरणी प्रसंस्करण कार्यों के लिए नए विकल्प हैं।

उत्तर

7

मान पीएचपी> = 5.3 के रूप में समारोह परिभाषा द्वारा निर्धारित में परोक्ष संदर्भ द्वारा पारित कर रहे हैं। array_walk() के लिए

समारोह परिभाषा:

bool array_walk (array &$array , callable $funcname [, mixed $userdata = NULL ]) 

नोट &$array। इस प्रकार, आपको PHP> = 5.3 में फ़ंक्शन कॉल में संदर्भ द्वारा सरणी को स्पष्ट रूप से पास करने की आवश्यकता नहीं है।

array_walk($my_array, 'my_callback'); 

लेकिन, आप यह सुनिश्चित करने के कॉलबैक स्वीकार करता है कि यह संदर्भ द्वारा मूल्य है उसके अनुसार (के रूप में nickb द्वारा प्रदर्शन) की आवश्यकता होगी।

इसके PHP 5.4 Call-time pass-by-reference - Easy fix available?

+0

आह ... धन्यवाद, समझ में आता है। दिलचस्प न्यूरेंस - आप संदर्भ द्वारा कॉल नहीं कर सकते हैं, लेकिन आप संदर्भित तर्कों के साथ एक फ़ंक्शन/विधि को परिभाषित कर सकते हैं। http://php.net/manual/en/language.references.pass.php मैं अभी भी उन कार्यों को बूलियन के बजाय संशोधित सरणी या शून्य की प्रतियां लौटाता हूं! – Ray

+0

हां, बिल्कुल। मदद करने के लिए खुशी हुई। –

6

क्योंकि आपको सरणी को संशोधित करने के संदर्भ में इसके पैरामीटर को स्वीकार करने के लिए कॉलबैक को परिभाषित करना चाहिए।

array_walk($my_array, function(&$el, $key) { $el = $el/2; }); 

तो इस तरह की एक त्वरित उदाहरण:

$my_array = range(2, 10, 2); 
array_walk($my_array, function(&$el, $key) { $el = $el/2; }); 
var_dump($my_array); 

विल output:

array(5) { 
    [0]=> 
    int(1) 
    [1]=> 
    int(2) 
    [2]=> 
    int(3) 
    [3]=> 
    int(4) 
    [4]=> 
    int(5) 
} 
+0

प्रतिक्रिया के लिए धन्यवाद एक बार देख ले, लेकिन Jasons जो नीचे स्पष्ट अपने किए गए संदर्भ मुद्दे को जोड़ा गया जवाब। यद्यपि आप अभी भी मुझसे ऊपर उठ गए हैं! उदाहरण के लिए – Ray

+0

मेरे साथ +1 भी। –

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