2012-06-03 14 views
16

¿Cómo puedo pasar un único argumento adicional a array_map devolución de llamada? En mi ejemplo, me gustaría pasar $smsPattern (como segundo argumento, después elemento actual de $featureNames) a la función array_map con $getLimit cierre:¿Cómo puedo pasar un único argumento adicional a la devolución de llamada array_map en PHP?

$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 raro:

Advertencia: array_map() [function.array-map]: Argumento # 3 debería ser una matriz.

Por supuesto di razón es para la reutilización de $getLimit de cierre con una expresión regular como $smsPattern. Gracias.

+0

¿Por qué no utilizar array_walk() en lugar, entonces puede pasar un argumento adicional –

+0

¿Para qué está usando 'array_filter'? –

+0

@ EmilVikström eliminando valores nulos. – gremo

Respuesta

39

Esto es exactamente lo que los cierres son sobre: ​​

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

$smsLimits = array_filter(array_map($getLimit, $features)); 

Si desea generalizar a otros patrones, envuelva la creación 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)); 
Cuestiones relacionadas