将平面数组中的每个整数乘以 60

问题描述 投票:0回答:6

我有一个名为

$times
的数组。这是一个小数字列表(
15,14,11,9,3,2
)。这些将由用户提交,并且应该是几分钟。由于 PHP 时间以秒为单位,我想将数组的每个元素乘以 60。

我一直在玩

array_walk
array_map
但我无法让它们工作。

php arrays time multiplication datetime-conversion
6个回答
29
投票

您可以使用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
也没有什么问题。


11
投票

只需使用 foreach 语句对数组进行

迭代
并相乘:

foreach ($times as $value) {

  $new_times[] = $value * 60;

}

6
投票

为了简单起见,您可能希望使用 foreach :

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

我假设数组的值是您想要相乘的值,而不是键。由于上述解决方案使用引用,它也会改变您的原始数组 - 但由于您之前的目标是

array_map
,我认为您想要这样。

上面的解决方案可能更容易理解,而且很可能比使用 array_map 更快,后者(显然)必须为每个元素调用一个函数。 我只会将 array_map 用于更复杂的事情,例如高级排序算法等,但绝对不会用于像这样微不足道的事情。


3
投票

我个人赞同 Gordon 的建议,即只使用 lambda(或创建的)函数,并且可以这样做:

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 (我认为它很方便)也可能很危险......然后维护无论如何都会变得令人畏惧(因为您必须记住每次都处理它您正在处理该代码)。如果您没有理由在这个阶段进行优化(即您的应用程序没有速度问题),那么现在就不要这样做,也不必担心使用 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 组合。


3
投票
array_walk($myArray, function(&$v) {$v *= 60;});

0
投票

当您想要将数字数组与给定因子相乘时:

foreach($numbers as &$n)
    $n *= $factor ;
unset($n) ;
© www.soinside.com 2019 - 2024. All rights reserved.