¿Cómo puedo pasar un solo argumento adicional a la devolución de llamada array_map en PHP?
arrays callback (1)
¿Cómo puedo pasar un solo argumento adicional a la array_map
llamada array_map
? En mi ejemplo, me gustaría pasar $smsPattern
(como segundo argumento, después del elemento actual en $featureNames
) a la función array_map
con el cierre de $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));
Con este código estoy recibiendo una advertencia extraña:
Advertencia: array_map () [function.array-map]: El argumento # 3 debe ser una matriz.
Por supuesto, la razón es para reutilizar el cierre de $getLimit
con otra expresión regular como $smsPattern
. Gracias.
Esto es exactamente de lo que se tratan los cierres:
$getLimit = function($name) use ($smsPattern) {
if(preg_match($smsPattern, $name, $m)) return $m[''l''];
};
$smsLimits = array_filter(array_map($getLimit, $features));
Si desea generalizarlo a otros patrones, envuelva la creación de la función en otra función:
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));
Y aquí está envuelto como una función anónima:
$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));