2012-06-03 3 views
16

단일 추가 인수array_map 콜백으로 전달할 수 있습니까? 내가 이상한 경고를 받고 있어요이 코드PHP에서 array_map 콜백에 하나의 인수를 추가로 전달할 수 있습니까?

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

: 내 예제에서 나는 $getLimit 폐쇄와 기능 array_map에 ($featureNames에서 현재 요소 후, 두 번째 인수로) $smsPattern를 전달하고 싶습니다

경고 : array_map() [function.array-map] : 인수 3은 을 배열로 사용해야합니다.

물론 클로저를 $smsPattern과 같은 다른 정규식으로 다시 사용하는 이유는 물론입니다. 감사. 당신이 다른 패턴으로 일반화 에 다른 기능 함수 생성을 포장 할 경우

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

를 그리고 여기있다

+0

왜 array_walk()를 사용하지 않는가? 대신에, 당신은 추가 인수를 넘겨 줄 수 있습니다. –

+0

'array_filter'를 어떻게 사용하고 있습니까? –

+0

@ EmilVikström이 Null 값을 제거합니다. – gremo

답변

39

이 폐쇄에 대해 무엇인지 정확히 익명 함수로 싸서 :

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