2012-06-03 53 views
16

如何通過單個附加參數array_map回撥?在我的例子,我想有$getLimit閉合通過$smsPattern(作爲第二個參數,在$featureNames當前元素之後)的功能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)); 

有了這個代碼我得到一個奇怪的警告:

Warning:array_map()[function.array-map]:參數#3應爲 是一個數組。

當然,原因是重新使用$getLimit封閉與另一個正則表達式,如$smsPattern。謝謝。

+0

爲什麼不使用array_walk()in替代,那麼你可以傳遞一個額外的參數 –

+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)); 
相關問題