2012-06-03 13 views
16

मैं एकल अतिरिक्त तर्क से array_map कॉलबैक कैसे पास कर सकता हूं?मैं PHP में array_map कॉलबैक के लिए एक अतिरिक्त अतिरिक्त तर्क कैसे पारित कर सकता हूं?

$features = $usage->getSubscription()->getUser()->getRoles(); 

// SMS regular expression in the form of ROLE_SEND_SMS_X 
$smsPattern = '/^ROLE_SEND_SMS_(?P<l>\d+)$/i'; 

// Function to get roles names and X from a role name 
$getNames = function($r) { return trim($r->getRole()); }; 
$getLimit = function($name, $pattern) { 
    if(preg_match($pattern, $name, $m)) return $m['l']; 
}; 

// Get roles names and their limits ignoring null values with array_filter 
$featuresNames = array_map($getNames, $features); 
$smsLimits  = array_filter(array_map($getLimit, $featureNames, $smsPattern)); 

इस कोड को मैं एक अजीब चेतावनी हो रही है के साथ:: मेरे उदाहरण में मैं $getLimit बंद के साथ समारोह array_map को $smsPattern पारित करने के लिए (एक दूसरे तर्क के रूप में, $featureNames में वर्तमान तत्व के बाद) करना चाहते हैं

चेतावनी: array_map() [function.array-map]: तर्क # 3 एक सरणी होना चाहिए।

बेशक डी कारण $getLimit$smsPattern जैसी एक नियमित नियमित अभिव्यक्ति के साथ बंद करने का कारण है। धन्यवाद।

+0

क्यों array_walk() का उपयोग नहीं करें स्थिर, तो आप एक अतिरिक्त तर्क –

+0

पास कर सकते हैं आप 'array_filter' का उपयोग कर क्या कर रहे हैं? –

+0

@ EmilVikström शून्य मानों को हटा रहा है। – gremo

उत्तर

39

यह ठीक है क्या बंद के बारे में कर रहे हैं: यदि आप अन्य पैटर्न के लिए यह सामान्य में समारोह निर्माण लपेट एक और समारोह चाहते हैं

$getLimit = function($name) use ($smsPattern) { 
    if(preg_match($smsPattern, $name, $m)) return $m['l']; 
}; 

$smsLimits = array_filter(array_map($getLimit, $features)); 

:

function patternMatcher($pattern) { 
    return function($name) use ($pattern) { 
     if(preg_match($pattern, $name, $m)) return $m['l']; 
    }; 
} 

$getLimit = patternMatcher($smsPattern); 
$smsLimits = array_filter(array_map($getLimit, $features)); 

और यहाँ यह है एक अज्ञात फ़ंक्शन के रूप में लपेटा गया:

$patternMatcher = function($pattern) { 
    return function($name) use ($pattern) { 
     if(preg_match($pattern, $name, $m)) return $m['l']; 
    }; 
}; 

$smsLimits = array_filter(array_map($patternMatcher($smsPattern), $features)); 
संबंधित मुद्दे