2011-01-03 4 views
30

Về cơ bản tôi muốn làm một cái gì đó như thế này:Callback chức năng sử dụng các biến tính bên ngoài của nó

$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 
$avg = array_sum($arr)/count($arr); 
$callback = function($val){ return $val < $avg }; 

return array_filter($arr, $callback); 

Đây có phải là thực sự có thể? Tính toán một biến ngoài hàm ẩn danh và sử dụng nó bên trong?

Trả lời

94

Bạn có thể sử dụng từ khóa use kế thừa biến từ phạm vi phụ huynh. Trong ví dụ của bạn, bạn có thể làm như sau:

$callback = function($val) use ($avg) { return $val < $avg; }; 

Để biết thêm thông tin, hãy xem trang hướng dẫn sử dụng trên anonymous functions.

+0

Cảm ơn rất nhiều mfonda, tôi đã xem xét trang hướng dẫn sử dụng nhưng bỏ qua từ khóa đó trong ví dụ mã. –

+0

bạn đã lưu ngày của tôi! đơn giản và hữu ích <3 – RezaSh

+9

Chỉ cần thêm vào câu trả lời ở trên, biến phạm vi gốc đang được COPIED thay vì được tạo sẵn bên trong hàm gọi lại. Nếu thông số gốc cần được điều chỉnh, tham chiếu phải được gửi như vậy '$ listOfValLessThanAvg = []; $ callback = function ($ val) sử dụng ($ avg, & $ listOfValLessThanAvg) { nếu ($ val <$ avg) array_push ($ listOfValLessThanAvg, $ val); }; ' – pravin

-4

sử dụng các biến toàn cục tức là $ GLOBAL [ 'trung bình']

$arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
$GLOBALS['avg'] = array_sum($arr)/count($arr); 
$callback = function($val){ return $val < $GLOBALS['avg'] }; 

$return array_filter($arr, $callback); 
+3

Biến toàn cầu được coi là thực hành không tốt. Hơn nữa, việc sử dụng các vars toàn cầu ở đây là quá mức cần thiết, vì 'use' là đủ. –

+0

Biến toàn cầu là ác! –