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