2014-09-23 21 views
23

Tôi có một mảng mà tôi muốn lọc theo biến bên ngoài. Tình hình là như sau:Sử dụng biến bên ngoài trong mảng_filter

$id = '1'; 
var_dump($id); 
$foo = array_filter($bar, function($obj){ 
    if (isset($obj->foo)) { 
     var_dump($id); 
     if ($obj->foo == $id) return true; 
    } 
    return false; 
}); 

Các var_dump lợi nhuận đầu tiên ID (được tự động thiết lập ofcourse), tuy nhiên, thứ hai var_dump trả về null.

Bất cứ ai có thể cho tôi biết lý do và cách giải quyết?

+0

$ thanh là gì và giá trị của $ thanh –

+1

@NitishKumar '$ bar' là những gì thường là một mảng –

+1

@ php-dev Có thể nói nó chắc chắn là một mảng, bởi vì nó không ném một lỗi PHP. Nó có thể không ** luôn luôn ** chắc chắn là một mảng, tùy thuộc vào mã, nhưng nó chắc chắn là một mảng trong trường hợp sử dụng, nơi ông nhận được lỗi được mô tả trong OP – Joe

Trả lời

38

Biến $id không nằm trong phạm vi của hàm. Bạn cần phải sử dụng mệnh đề use để làm cho biến bên ngoài truy cập:

$foo = array_filter($bar, function($obj) use ($id) { 
    if (isset($obj->foo)) { 
     var_dump($id); 
     if ($obj->foo == $id) return true; 
    } 
    return false; 
}); 
+1

** Lưu ý: ** Yêu cầu PHP 5.3.x ... xem thêm http://stackoverflow.com/a/25994339/42223 – dreftymac

+1

@dreftymac 5.3 được yêu cầu chỉ cho cú pháp hàm ẩn danh, nó không cụ thể đối với 'use' bổ nghĩa. – Barmar

+0

Bạn nói đúng, cảm ơn vì đã làm rõ điểm đó. – dreftymac

5

Vì chức năng đóng của bạn không thể thấy $id. Bạn cần từ khóa use:

$foo = array_filter($bar, function($obj) use ($id) { 
6

Vấn đề phạm vi biến!

Simple sửa chữa sẽ là:

$id = '1'; 
var_dump($id); 
$foo = array_filter($bar, function($obj){ 
    global $id; 
    if (isset($obj->foo)) { 
     var_dump($id); 
     if ($obj->foo == $id) return true; 
    } 
    return false; 
}); 

hay, kể từ PHP 5,3

$id = '1'; 
var_dump($id); 
$foo = array_filter($bar, function($obj) use ($id) { 
    if (isset($obj->foo)) { 
     var_dump($id); 
     if ($obj->foo == $id) return true; 
    } 
    return false; 
}); 

Hy vọng nó giúp

+1

Tôi không nghĩ rằng phiên bản đầu tiên sẽ hoạt động trước 5.3, vì các chức năng ẩn danh đã được thêm vào 5.3. Trước đó, bạn phải sử dụng hàm 'create_function()', cùng với khai báo 'global'. – Barmar

Các vấn đề liên quan