अन्य उत्तरों array_walk (इन-प्लेस संशोधन) और array_map (वापसी संशोधित प्रतिलिपि) के बीच अंतर का प्रदर्शन करते हैं। हालांकि, वे वास्तव में array_reduce का उल्लेख नहीं करते हैं, जो array_map और array_filter को समझने का एक रोशनी तरीका है।
array_reduce(array('a', 'b', 'c', 'd'),
'my_function',
$accumulator)
सरणी के तत्वों को देखते हुए समारोह का उपयोग कर एक समय में संचायक एक के साथ संयुक्त कर रहे हैं,:
array_reduce समारोह एक सरणी, एक दो तर्क समारोह और एक 'संचायक', इस तरह से लेता है। , आप छोरों के संदर्भ में सोचने के लिए पसंद करते हैं
my_function(
my_function(
my_function(
my_function(
$accumulator,
'a'),
'b'),
'c'),
'd')
यह निम्न कार्य की तरह है (मैं वास्तव में एक वापस आने के रूप में इस का उपयोग किया है जब array_reduce नहीं था: ऊपर कॉल का परिणाम यह कर के रूप में ही है उपलब्ध): हम एक यात्रा के माध्यम से परिणाम जमा करने के लिए उपयोग कर सकते हैं:
function array_reduce($array, $function, $accumulator) {
foreach ($array as $element) {
$accumulator = $function($accumulator, $element);
}
return $accumulator;
}
यह पाशन संस्करण यह स्पष्ट कारण है कि मैं तीसरा तर्क एक 'संचायक' नामक गया है बनाता है।
तो array_map और array_filter के साथ इसका क्या संबंध है? यह पता चला है कि वे दोनों एक विशेष प्रकार की array_reduce हैं। हम उन्हें इस तरह लागू कर सकते हैं:
array_map($function, $array) === array_reduce($array, $MAP, array())
array_filter($array, $function) === array_reduce($array, $FILTER, array())
तथ्य यह है कि array_map पर ध्यान न दें और एक अलग क्रम में अपने तर्क ले array_filter; यह सिर्फ PHP का एक और quirk है। महत्वपूर्ण बात यह है कि दाएं हाथ की तरफ उन कार्यों को छोड़कर समान है जिन्हें मैंने $ एमएपी और $ फ़िल्टर कहा है। तो, वे क्या दिखते हैं?
$MAP = function($accumulator, $element) {
$accumulator[] = $function($element);
return $accumulator;
};
$FILTER = function($accumulator, $element) {
if ($function($element)) $accumulator[] = $element;
return $accumulator;
};
जैसा कि आप देख सकते हैं, दोनों कार्य $ accumulator में लेते हैं और इसे फिर से वापस कर देते हैं। इन कार्यों में दो मतभेद हैं:
- $ एमएपी हमेशा $ accumulator में संलग्न होगा, लेकिन $ FILTER केवल तभी होगा यदि $ फ़ंक्शन ($ तत्व) सत्य है।
- $ फ़िल्टर मूल तत्व जोड़ता है, लेकिन $ एमएपी $ फ़ंक्शन ($ तत्व) जोड़ता है।
ध्यान दें कि यह बेकार मामूली से बहुत दूर है; हम अपने एल्गोरिदम को और अधिक कुशल बनाने के लिए इसका उपयोग कर सकते हैं!
हम अक्सर इन दो उदाहरणों की तरह कोड देख सकते हैं:
// Transform the valid inputs
array_map('transform', array_filter($inputs, 'valid'))
// Get all numeric IDs
array_filter(array_map('get_id', $inputs), 'is_numeric')
array_map का उपयोग करना और छोरों के बजाय array_filter बनाता है इन उदाहरणों काफी अच्छा लग रही है। हालांकि, यह बहुत अक्षम हो सकता है यदि $ इनपुट बड़ा है, क्योंकि पहला कॉल (मानचित्र या फ़िल्टर) $ इनपुट को पार करेगा और एक मध्यवर्ती सरणी का निर्माण करेगा। यह इंटरमीडिएट सरणी सीधे दूसरी कॉल में पारित की जाती है, जो पूरी चीज को फिर से पार कर लेगी, फिर इंटरमीडिएट सरणी को कचरा इकट्ठा करने की आवश्यकता होगी।
हम इस इंटरमीडिएट सरणी से इस तथ्य का शोषण कर सकते हैं कि array_map और array_filter array_reduce के दोनों उदाहरण हैं।
// Transform valid inputs
array_reduce($inputs,
function($accumulator, $element) {
if (valid($element)) $accumulator[] = transform($element);
return $accumulator;
},
array())
// Get all numeric IDs
array_reduce($inputs,
function($accumulator, $element) {
$id = get_id($element);
if (is_numeric($id)) $accumulator[] = $id;
return $accumulator;
},
array())
नोट:: उन्हें संयोजन से, हम केवल हर उदाहरण में एक बार $ आदानों पार करने के लिए है array_map मेरे कार्यान्वयन और इसके बाद के संस्करण array_filter वास्तव में PHP के की तरह व्यवहार नहीं किया जाएगा, के बाद से मेरी array_map केवल एक में एक सरणी संभाल कर सकते हैं समय और मेरा array_filter "खाली" का उपयोग अपने डिफ़ॉल्ट $ फ़ंक्शन के रूप में नहीं करेगा। इसके अलावा, न तो कुंजी को सुरक्षित रखेगा।
उन्हें PHP की तरह व्यवहार करना मुश्किल नहीं है, लेकिन मुझे लगा कि ये जटिलताओं को मूल विचार को स्थानांतरित करना कठिन होगा।
यह array_reduce() के माध्यम से नामित सरणी प्रसंस्करण के लिए एक अच्छी चाल है। यदि आप array_map, array_walk, और array_filter की जांच कर रहे हैं तो पढ़ने के लायक होंगे। http://stackoverflow.com/questions/11563119/array-map-callback-access-to-associative-array-key-and-value/15303635#15303635 –