2010-04-17 32 views
9

Tôi có một mảng gọi là $times. Đó là danh sách các số nhỏ (15,14,11,9,3,2). Đây sẽ là người dùng được gửi và được coi là phút. Khi thời gian PHP hoạt động trên giây, tôi muốn nhân mỗi phần tử của mảng của tôi với 60.Làm cách nào để nhân mỗi mục trong một mảng dễ dàng với PHP?

Tôi đã chơi xung quanh với array_walkarray_map nhưng tôi không thể làm việc đó.

+0

Tôi sẽ tìm giải pháp array_map/bcmul mà Gordon cung cấp nếu bạn không muốn sử dụng chức năng foreach hoặc tùy chỉnh, bạn đã xem xét * không * nhân mảng với 60 và thay vào đó chia thời gian PHP cho 60 ? –

+0

Tôi sẽ thử tất cả các ví dụ, chỉ vì vậy tôi biết làm thế nào để làm điều đó trong tương lai. Vòng lặp foreach dường như đơn giản nhất. Sự khác nhau giữa * = và * là gì? – Henryz

+0

Henryz: $ a * = 6 là dạng ngắn của $ a = $ a * 6 – lamas

Trả lời

7

Chỉ lặp qua mảng với foreach tuyên bố và nhân:

foreach ($times as $value) { 

    $new_times[] = $value * 60; 

} 
+1

Điều này làm việc rất tốt cho những gì tôi đã cố gắng làm, cảm ơn. – Henryz

22

Bạn có thể sử dụng array_map:

array_map() trả về một mảng chứa tất cả các yếu tố của arr1 sau khi áp dụng chức năng gọi lại cho từng chức năng. Số lượng các thông số chức năng gọi lại chấp nhận phải phù hợp với số lượng mảng truyền cho array_map()

Ví dụ với hàm lambda cho callbacks:

array_map(function($el) { return $el * 60; }, $input); 

Tương tự cho PHP < 5.3

array_map(create_function('$el', 'return $el * 60;'), $input); 

Hoặc với bcmul để gọi lại

array_map('bcmul', $input, array_fill(0, count($input), 60)); 

Nhưng không có gì sai khi chỉ sử dụng foreach cho việc này.

5

Bạn có thể muốn sử dụng foreach vì đơn giản trong trường hợp của bạn:

foreach($times as &$val){ $val *= 60; } 

tôi giả sử rằng các giá trị của mảng của bạn là những người bạn muốn nhân, không phải là chìa khóa. Vì giải pháp trên sử dụng tài liệu tham khảo, nó cũng sẽ thay đổi mảng ban đầu của bạn - nhưng khi bạn đang hướng tới array_map trước đây, tôi nghĩ rằng bạn muốn điều đó.

Giải pháp trên có lẽ dễ hiểu hơn và có khả năng nhanh hơn sử dụng array_map (rõ ràng) phải gọi hàm cho từng phần tử. Tôi chỉ sử dụng array_map cho những thứ phức tạp hơn như các thuật toán sắp xếp nâng cao và vân vân, nhưng chắc chắn không phải là một thứ tầm thường như thế này.

3

Tôi muốn đích thân đề nghị thứ hai từ Gordon chỉ cần sử dụng một lambda (hoặc tạo) chức năng và một trong hai làm:

array_map(function($el) { return $el * 60; }, $input_array); 

(PHP> = 5.3) hoặc

array_map(create_function('$el', 'return $el * 60;'), $input_array); 

(PHP < 5.3)

Chắc chắn tôi không thấy lý do sao chép mảng (có thể trở nên cồng kềnh nếu có nhiều giá trị liên quan); Ngoài ra, hãy chú ý rằng việc sử dụng foreach (thứ hai có thể thuận tiện) cũng có thể nguy hiểm nếu bạn không làm việc cẩn thận ... và sau đó việc bảo trì có thể trở nên khó khăn (bởi vì bạn phải nhớ xử lý nó mọi lúc bạn làm việc trên mã đó).Nếu bạn không có lý do để tối ưu hóa ở giai đoạn này (IE ứng dụng của bạn không có vấn đề về tốc độ), đừng làm điều đó ngay bây giờ và đừng lo lắng về việc sử dụng array_map. Bạn có thể nghĩ về sự bảo trì dễ dàng ngay bây giờ và tối ưu hóa sau này, trong trường hợp bạn thực sự cần.

Trong thực tế, nếu bạn đi bằng cách tham khảo và sau đó bạn sử dụng foreach một lần nữa, bạn có thể bước vào kết quả bất ngờ (xem ví dụ dưới đây ...)

$a=array('1','2','3'); 

foreach ($a as &$v) { 
     $v *= 60; 
} 
print_r($a); 
foreach ($a as $v); 
print_r($a); 

Output là:

Mảng ( [0] => 60 [1] => 120 [2] => 180 )

mảng ( [0] => 60 [1] => 120 [2] => 120 )

Có lẽ không phải những gì bạn mong đợi vào chu kỳ thứ hai. Đây là lý do tại sao tôi thường tránh kết hợp byref & byref khi có thể.

+0

Xin chào, cảm ơn câu trả lời, điều này dường như chỉ hoạt động nếu nó xây dựng một mảng mới như v = [] này. Không chắc chắn lý do tại sao: S – Henryz

2
array_walk($myArray, function(&$v) {$v *= 60;}); 
+0

Mặc dù đoạn mã này có thể giải quyết được câu hỏi, [bao gồm cả giải thích] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. - [Từ đánh giá] (https://stackoverflow.com/review/low-quality-posts/11668559) – Ferrybig

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