如何在PHP中向array_map回调传递一个额外的参数?

gre*_*emo 16 php arrays closures callback array-map

我怎样才能将一个额外的参数传递给array_map回调?在我的例子中,我想将$smsPattern(作为第二个参数,在当前元素之后$featureNames)传递给array_map具有$getLimit闭包的函数:

$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));
Run Code Online (Sandbox Code Playgroud)

有了这段代码,我得到了一个奇怪的警告:

警告:array_map()[function.array-map]:参数#3应该是一个数组.

当然di的理由是重用$getLimit封闭与另一个正则表达式,如$smsPattern.谢谢.

Emi*_*röm 40

这正是关闭的内容:

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

$smsLimits = array_filter(array_map($getLimit, $features));
Run Code Online (Sandbox Code Playgroud)

如果要将其概括为其他模式,请将函数创建包装到另一个函数中:

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));
Run Code Online (Sandbox Code Playgroud)

在这里它被包装成一个匿名函数:

$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));
Run Code Online (Sandbox Code Playgroud)