2015-01-22 13 views
6

Tôi chỉ muốn sử dụng array_walk() với ceil() để làm tròn tất cả các phần tử trong một mảng. Nhưng nó không hoạt động.Làm thế nào để array_walk làm việc với các hàm dựng sẵn PHP?

Mã:

$numbs = array(3, 5.5, -10.5); 
array_walk($numbs, "ceil"); 
print_r($numbs); 

sản lượng nên là: 3,6, -10

Các thông báo lỗi:

Cảnh báo: ceil() dự đoán chính xác 1 tham số, 2 được cung cấp trên dòng 2

đầu ra là: 3,5,5, -10,5 (Giống như trước khi sử dụng ceil())

Tôi cũng đã thử với round().

Trả lời

3

Tôi đã gặp vấn đề tương tự với một hàm PHP khác. Bạn có thể tạo "chức năng ceil của riêng bạn". Trong trường hợp đó nó là rất dễ dàng để giải quyết:

function myCeil(&$list){ 
    $list = ceil($list); 
} 

$numbs = array(3, 5.5, -10.5); 
array_walk($numbs, "myCeil"); 
print_r($numbs); 
7

Sử dụng array_map để thay thế.

$numbs = array(3, 5.5, -10.5); 
$numbs = array_map("ceil", $numbs); 
print_r($numbs); 

array_walk thực sự đi 2 thông số để gọi lại, và một số chức năng built-in không thích bị gọi với quá nhiều thông số (có một lưu ý về vấn đề này trên trang tài liệu cho array_walk). Đây chỉ là một cảnh báo , đây không phải là lỗi.

array_walk cũng yêu cầu thông số đầu tiên của cuộc gọi lại là tham chiếu nếu bạn muốn sửa đổi mảng. Vì vậy, ceil() vẫn đang được gọi cho mỗi phần tử, nhưng vì nó không lấy giá trị làm tham chiếu, nên nó không cập nhật mảng.

array_map tốt hơn cho tình huống này.

+1

Điều đó hoạt động tốt. Cảm ơn –

+0

Bạn được chào đón :-) Đôi khi một hàm 'array_ *' tốt hơn một hàm khác, tùy thuộc vào tình huống. –

2

Đó là bởi vì array_walk nhu cầu chức năng mà tham số đầu tiên là một tài liệu tham khảo &

function myCeil(&$value){ 
    $value = ceil($value); 
} 

$numbs = array(3, 5.5, -10.5); 
array_walk($numbs, "myCeil"); 
print_r($numbs); 
2

Lý do nó không hoạt động được vì ceil($param) chỉ hy vọng một tham số thay vì hai tham số.

Những gì bạn có thể làm:

$numbs = array(3, 5.5, -10.5); 
array_walk($numbs, function($item) { 
    echo ceil($item); 
}); 

Nếu bạn muốn lưu các giá trị sau đó đi trước và sử dụng array_map mà trả về một mảng.

CẬP NHẬT

Tôi đề nghị để đọc answer này trên stackoverflow điều này giải thích rất rõ sự khác nhau giữa array_map, array_walk, và array_filter

Hope this helps.

+0

Không hoàn toàn. * Warning * nói "ceil() hy vọng chính xác 1 tham số, 2 cho trước". 'array_walk' sẽ gọi hàm gọi lại của bạn và chuyển nó 2 tham số (' $ value' và '$ key'). Mảng không được cập nhật vì 'array_walk' sẽ chỉ làm điều đó nếu tham số' $ value' là tham chiếu * (và giá trị của nó được cập nhật trong hàm gọi lại). –

+2

Cảm ơn được lặp lại! :) – flangofas

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