2010-04-17 109 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

相关问题