Как я могу передать один дополнительный аргумент для обратного вызова array_map в PHP?

Как передать один дополнительный аргумент на 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));

С помощью этого кода я получаю странное предупреждение:

Предупреждение: array_map() [function.array-map]: Аргумент № 3 должен быть массивом.

Конечно, причина заключается в повторном использовании закрытия $getLimit с другим регулярным выражением типа $smsPattern. Спасибо.

Ответы

Ответ 1

Именно это замыкания:

$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));