我有一個名爲$times
的數組。這是一個小號碼列表(15,14,11,9,3,2
)。這些將被用戶提交,並應該是分鐘。由於PHP時間工作秒,我想我的陣列的每個元素乘以60.如何使用PHP輕鬆地將數組中的每個項目相乘?
我一直玩和array_map
但我不能讓那些工作。
我有一個名爲$times
的數組。這是一個小號碼列表(15,14,11,9,3,2
)。這些將被用戶提交,並應該是分鐘。由於PHP時間工作秒,我想我的陣列的每個元素乘以60.如何使用PHP輕鬆地將數組中的每個項目相乘?
我一直玩和array_map
但我不能讓那些工作。
只是迭代與foreach
語句,並多次在陣列上:
foreach ($times as $value) {
$new_times[] = $value * 60;
}
這對我正在嘗試做的事很有幫助,謝謝。 – Henryz 2010-04-18 10:08:05
您可以使用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
也沒有問題。
你可能想在你的情況下使用的foreach爲了簡單:
foreach($times as &$val){ $val *= 60; }
我假設你的數組的值要乘的,沒有鑰匙。由於上述解決方案使用引用,它也會改變你的原始數組 - 但是因爲你之前瞄準的是array_map
,所以我認爲你需要這個。
上面的解決方案可能比使用array_map更容易理解,並且很可能比使用array_map更快(顯然)必須爲每個元素調用一個函數。 我只會使用array_map來處理更復雜的事情,比如高級排序算法等等,但絕對不會像這樣微不足道。
我個人第二從戈登的建議,只使用一個拉姆達(或創建)函數,要麼做:
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組合的原因。
嗨,謝謝你的回答,這似乎工作,如果它建立一個像這樣v = []的新陣列。不知道爲什麼:S – Henryz 2010-04-18 10:07:38
array_walk($myArray, function(&$v) {$v *= 60;});
雖然此代碼片段可能會解決問題,但[包括解釋](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
我會去,如果你不希望使用的foreach或自定義功能尚未戈登提供的array_map/bcmul的解決方案,你認爲是*不*乘以60的陣列,而是除以60的PHP時間? – 2010-04-17 23:39:34
我將嘗試所有的例子,所以我知道將來如何去做。 foreach循環似乎是最簡單的。 * =和*之間的區別是什麼? – Henryz 2010-04-18 10:05:28
Henryz:$ a * = 6是$ a = $ a * 6的簡寫形式 – lamas 2010-04-18 12:38:38