php arrays callback closures array-map

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