अनाम सरणी पर अनाम फ़ंक्शन की मैपिंग करते समय, कुंजियों तक पहुंचने का कोई तरीका नहीं है:
array_map(
function($val) use ($foo) { },
array(key1 => val1,
key2 => val2,
));
array_reduce को कुंजियों तक पहुँच नहीं मिलती है। array_walk कुंजियों का उपयोग कर सकता है, लेकिन सरणी को संदर्भ द्वारा पारित किया जाता है, जिसके लिए अप्रत्यक्ष की एक परत की आवश्यकता होती है।
कुछ समाधान हैं:
जोड़े की सरणी
यह बुरा है, क्योंकि हम मूल सरणी बदल रहे हैं। प्लस बॉयलरप्लेट "सरणी ()" कॉल सरणी की लंबाई के साथ रैखिक रूप से वृद्धि करते हैं:
array_map(
function($pair) use ($foo) {
list($key, $val) = $pair;
},
array(array(key1, val1),
array(key2, val2),
));
अस्थायी चर
हम मूल सरणी पर कार्य कर रहे हैं, और बॉयलरप्लेट निरंतर है, लेकिन हम आसानी से मौजूदा चर को क्लोब कर सकते हैं:
$i_hope_this_does_not_conflict = array(key1 => val1,
key2 => val2,
);
array_map(
function($key, $val) use ($foo) { },
array_keys($i_hope_this_does_not_conflict),
$i_hope_this_does_not_conflict);
unset($i_hope_this_does_not_conflict);
एक शॉट समारोह
हम मौजूदा नामों को रोकने के लिए फ़ंक्शन स्कोप का उपयोग कर सकते हैं, लेकिन "उपयोग" की एक अतिरिक्त परत जोड़ना होगा:
call_user_func(
function($arr) use ($foo) {
return array_map(function($key, $val) use ($foo) { },
array_keys($arr),
$arr);
},
array(key1 => val1,
key2 => val2,
));
बहु-तर्क एक-शॉट फ़ंक्शन
हम उस फ़ंक्शन को परिभाषित करते हैं जिसे हम मूल उपयोग में मैप कर रहे हैं "बॉयलरप्लेट" को रोकने के लिए):
call_user_func(
function($f, $arr) {
return array_map($f, array_keys($arr), $arr);
},
function($key, $val) use ($foo) { },
array(key1 => val1,
key2 => val2,
));
नया समारोह
ध्यान देने वाली बात यह है कि हमारे पिछले एक-शॉट फंक्शन में एक अच्छा, सामान्य हस्ताक्षर है और यह array_map की तरह दिखता है। हम इसे एक नाम देना चाहते हैं और इसे फिर से उपयोग कर सकते हैं:
function array_mapk($f, $arr) {
return array_map($f, array_keys($arr), $arr);
}
हमारा एप्लिकेशन कोड तब बन जाता है:
array_mapk(
function($key, $val) use ($foo) { },
array(key1 => val1,
key2 => val2,
));
अप्रत्यक्ष एरे वॉक
ऊपर लिखते समय मैंने array_walk को नजरअंदाज कर दिया था क्योंकि इसे इसके तर्क को संदर्भ द्वारा पारित करने की आवश्यकता है; हालाँकि, मैंने महसूस किया है कि call_user_func का उपयोग करके इसके आसपास काम करना आसान है। मुझे लगता है कि यह अब तक का सबसे अच्छा संस्करण है:
call_user_func(
'array_walk',
array(key1 => val1,
key2 => val2,
),
function($val, $key) use ($foo) { });