2012-07-23 33 views
5

PHP có một số hàm tuyệt vời (như array_walk) cho phép bạn xử lý từng phần tử trong một mảng. Chúng thường được thiết lập để bạn chỉ định mảng bạn muốn xử lý như tham số đầu tiên và hàm gọi lại để áp dụng cho từng phần tử làm phần tử thứ hai. Các hàm này trả về các boolean cho biết thành công, không phải là bản sao của mảng đã sửa đổi như bạn mong đợi. Nếu bạn muốn mảng được sửa đổi, bạn phải chuyển mảng theo tham chiếu như array_walk(&$my_array, 'my_callback');Sử dụng các hàm như array_walk (và các hàm tương tự) để sửa đổi mảng trong PHP> = 5.3

Tuy nhiên, trong PHP 5.3 trở lên, nếu bạn chuyển qua tham chiếu đến hàm gọi, bạn sẽ gặp lỗi E_DEPRECATED.

Có ai biết (nếu có) một cách chính xác để sử dụng các hàm này để sửa đổi mảng mà không kích hoạt lỗi và không triệt tiêu chúng không? Có các lựa chọn thay thế mới hơn cho các chức năng xử lý mảng cũ này không.

Trả lời

7

Các giá trị được thông qua tham khảo ngầm trong PHP> = 5.3 được xác định bởi định nghĩa hàm.

định nghĩa chức năng cho array_walk():

bool array_walk (array &$array , callable $funcname [, mixed $userdata = NULL ]) 

Note &$array. Như vậy, bạn không cần phải chuyển mảng một cách rõ ràng bằng cách tham chiếu trong lời gọi hàm trong PHP> = 5.3.

array_walk($my_array, 'my_callback'); 

Tuy nhiên, bạn sẽ cần phải đảm bảo rằng các callback chấp nhận giá trị của nó bằng cách tham chiếu phù hợp (như chứng minh bởi nickb).

Ngoài ra hãy xem tại PHP 5.4 Call-time pass-by-reference - Easy fix available?

+0

Ah ... cảm ơn, có ý nghĩa. Sắc thái thú vị - bạn không thể gọi theo tham chiếu, nhưng bạn có thể định nghĩa một hàm/phương thức với các đối số được tham chiếu. http://php.net/manual/en/language.references.pass.php Tôi vẫn muốn những hàm đó trả về các bản sao của mảng đã sửa đổi hoặc null thay vì boolean! – Ray

+0

Vâng, chính xác. Vui mừng được giúp đỡ. –

6

Vì bạn nên xác định hàm gọi lại để chấp nhận tham số của nó bằng tham chiếu để sửa đổi mảng.

array_walk($my_array, function(&$el, $key) { $el = $el/2; }); 

Vì vậy, một ví dụ nhanh như thế này:

$my_array = range(2, 10, 2); 
array_walk($my_array, function(&$el, $key) { $el = $el/2; }); 
var_dump($my_array); 

Will output:

array(5) { 
    [0]=> 
    int(1) 
    [1]=> 
    int(2) 
    [2]=> 
    int(3) 
    [3]=> 
    int(4) 
    [4]=> 
    int(5) 
} 
+0

Cảm ơn thông tin phản hồi, nhưng tên gọi là Jasons trả lời dưới đây mà thêm vào làm cho vấn đề tham khảo của bạn rõ ràng hơn. Bạn vẫn có một upvote từ tôi mặc dù! – Ray

+0

+1 từ tôi cũng như ví dụ. –

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