2013-02-12 26 views

Trả lời

36

Thứ nhất, array_walk là sai chức năng cho mục đích của bạn cả.

Thứ hai, mảng_map không thay đổi mảng ban đầu nhưng trả về mảng được ánh xạ. Vì vậy, điều bạn cần là:

$a = array_map('trim', $a); 
+1

cảm ơn, đã bỏ lỡ những gì array_map đã trở lại - nhưng bạn có thể xác định lý do tại sao bạn sẽ concider array_walk là một hàm sai? –

+8

nếu bạn đọc [hướng dẫn] (http://php.net/array-walk), bạn sẽ thấy rằng array_walk chỉ ** gọi ** một hàm với mỗi giá trị (và khóa) của một mảng. Vì vậy, nó sẽ có tác dụng tương tự như: 'trim ('test_data_1', 0); trim ('test_data_2', 1) '- không có bài tập, không có tác dụng phụ (và một tham số thứ hai sai để cắt, nhân tiện). Bạn * có thể * tất nhiên viết chức năng của riêng bạn cho array_walk, mà sau đó trims các phần tử mảng thực tế. –

0

array_map trả về một mảng mới, hãy thử này

$a=array('test_data_1 ','test_data_2'); 
array_walk($a, 'trim'); 
$a = array_map('trim', $a); 
foreach($a AS $b){ 
    var_dump($b); 
} 
0

trim() là cách tốt để chuẩn bị dữ liệu trước khi kiểm tra hoặc chèn dữ liệu vào. Bạn có thể sẽ muốn chuẩn bị nhiều hơn là chỉ cắt, mặc dù. Một kỹ thuật mát Tôi đã nhìn thấy trước là "ống" thông qua chức năng chuẩn bị của bạn:

$data = prepare($data, array(
    'first_name' => 'trim|custom_function', 
    'surname' => 'trim', 
)); 

Vẻ đẹp của nó làm theo cách này làm cho mã dễ dàng đọc được và nó vô cùng dễ dàng để chạy các chức năng trên mỗi phần tử mảng cụ thể.

Dưới đây là một chức năng tôi đã gõ lên một cách nhanh chóng:

function prepare($data, $arr){ 
    foreach($arr as $input_name => $functions){ 
    foreach(explode('|', $functions) as $function){ 
     $data[$input_name] = call_user_func($function, $data[$input_name]); 
    } 
    } 
    return $data; 
} 
+4

hey, xin lỗi nhưng câu trả lời của bạn dường như không liên quan đến câu hỏi ở trên –

+0

@ JaakKütt có, nhưng cắt tỉa giá trị mảng là để chuẩn bị dữ liệu. Đôi khi nó giúp đề xuất một cách tiếp cận linh hoạt hơn với những gì nhà phát triển đang nhắm tới. – rybo111

3

Đối array_walk để sửa đổi các mục (giá trị) trong mảng, các callback phải là một hàm mang theo tham số đầu tiên của mình bằng cách tham khảo và sửa đổi nó (mà không phải là trường hợp của đồng bằng trim), do đó, mã của bạn sẽ trở thành:

$a=array('test_data_1 ','test_data_2'); 
array_walk($a, function (&$value) { $value = trim($value); }); // by-reference modification 
// (no array_map) 
foreach($a AS $b){ 
    var_dump($b); 
} 

Ngoài ra, với array_map bạn phải gán mảng với giá trị trả về, do đó, mã của bạn sẽ trở thành:

$a=array('test_data_1 ','test_data_2'); 
// (no array_walk) 
$a = array_map('trim', $a); // array reassignment 
foreach($a AS $b){ 
    var_dump($b); 
} 
Các vấn đề liên quan