2012-06-03 26 views
16

Làm cách nào để vượt qua một đối số bổ sung bổ sung tới array_map gọi lại? Trong ví dụ của tôi, tôi muốn vượt qua $smsPattern (như là một đối số thứ hai, sau khi yếu tố hiện tại $featureNames) với chức năng array_map với $getLimit đóng cửa:Làm thế nào tôi có thể vượt qua một đối số bổ sung duy nhất để array_map gọi lại trong 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)); 

Với mã này tôi nhận được một cảnh báo lạ:

Cảnh báo: array_map() [function.array-map]: Đối số # 3 nên là một mảng.

Lý do di nhiên là để sử dụng lại $getLimit đóng bằng một biểu thức chính quy khác như $smsPattern. Cảm ơn.

+0

Tại sao không sử dụng array_walk() trong thay vào đó, bạn có thể vượt qua một đối số bổ sung –

+0

Bạn đang sử dụng 'array_filter' để làm gì? –

+0

@ EmilVikström xóa giá trị null. – gremo

Trả lời

39

Đây chính là điều đóng cửa khoảng:

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

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

Nếu bạn muốn khái quát nó với các mẫu khác, quấn tạo hàm thành khác chức năng:

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

Và ở đây nó là được bao bọc dưới dạng hàm ẩn danh:

$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)); 
Các vấn đề liên quan