2010-04-17 54 views
9

我有一個名爲$times的數組。這是一個小號碼列表(15,14,11,9,3,2)。這些將被用戶提交,並應該是分鐘。由於PHP時間工作秒,我想我的陣列的每個元素乘以60.如何使用PHP輕鬆地將數組中的每個項目相乘?

我一直玩和array_map但我不能讓那些工作。

+0

我會去,如果你不希望使用的foreach或自定義功能尚未戈登提供的array_map/bcmul的解決方案,你認爲是*不*乘以60的陣列,而是除以60的PHP時間? – 2010-04-17 23:39:34

+0

我將嘗試所有的例子,所以我知道將來如何去做。 foreach循環似乎是最簡單的。 * =和*之間的區別是什麼? – Henryz 2010-04-18 10:05:28

+0

Henryz:$ a * = 6是$ a = $ a * 6的簡寫形式 – lamas 2010-04-18 12:38:38

回答

7

只是迭代foreach語句,並多次在陣列上:

foreach ($times as $value) { 

    $new_times[] = $value * 60; 

} 
+1

這對我正在嘗試做的事很有幫助,謝謝。 – Henryz 2010-04-18 10:08:05

22

您可以使用array_map

array_map()返回一個包含ARR1的所有元素應用後的數組回調函數給每一個。回調函數接受的參數的數量應匹配傳遞給array_map()

與lambda函數實例回調陣列的數目:

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

同樣爲PHP < 5.3

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

或用bcmul進行回撥

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

但是,使用foreach也沒有問題。

5

你可能想在你的情況下使用的foreach爲了簡單:

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

我假設你的數組的值要乘的,沒有鑰匙。由於上述解決方案使用引用,它也會改變你的原始數組 - 但是因爲你之前瞄準的是array_map,所以我認爲你需要這個。

上面的解決方案可能比使用array_map更容易理解,並且很可能比使用array_map更快(顯然)必須爲每個元素調用一個函數。 我只會使用array_map來處理更復雜的事情,比如高級排序算法等等,但絕對不會像這樣微不足道。

3

我個人第二從戈登的建議,只使用一個拉姆達(或創建)函數,要麼做:

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

(PHP> = 5.3)或

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

(PHP < 5.3)

當然,我沒有看到重複數組的原因(如果涉及很多值,可能會變得很麻煩)。另外,請注意,如果您不仔細使用它,那麼使用foreach(我可以很方便地使用foreach)也會很危險......然後,維護可能會變得令人生畏(因爲您必須記住每次處理它你使用該代碼)。如果你在這個階段沒有優化的理由(IE你的應用程序沒有速度問題),現在不要這樣做,不要擔心使用array_map。您現在可以考慮簡化維護並稍後進行優化,以防您確實需要。

事實上,如果你去參考,然後你再次使用的foreach,你可能會步入意想不到的結果(參見下面的例子......)

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

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

輸出是:

陣列 ( [0] => 60 [1] => 120 [2] => 180 )

陣列 ( [0] => 60 [1] => 120 [2] => 120 )

可能不是你期望在所述第二週期的內容。 這就是爲什麼我通常可以避免使用foreach & byref組合的原因。

+0

嗨,謝謝你的回答,這似乎工作,如果它建立一個像這樣v = []的新陣列。不知道爲什麼:S – Henryz 2010-04-18 10:07:38

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

雖然此代碼片段可能會解決問題,但[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於改進您的帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 - [來自評論](https://stackoverflow.com/review/low-quality-posts/11668559) – Ferrybig 2016-03-17 13:18:49

相關問題