我有一个名为
$times
的数组。这是一个小数字列表(15,14,11,9,3,2
)。这些将由用户提交,并且应该是几分钟。由于 PHP 时间以秒为单位,我想将数组的每个元素乘以 60。
我一直在玩
array_walk
和 array_map
但我无法让它们工作。
您可以使用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 $value) {
$new_times[] = $value * 60;
}
为了简单起见,您可能希望使用 foreach :
foreach( $times as &$val ){ $val *= 60; }
我假设数组的值是您想要相乘的值,而不是键。由于上述解决方案使用引用,它也会改变您的原始数组 - 但由于您之前的目标是
array_map
,我认为您想要这样。
上面的解决方案可能更容易理解,而且很可能比使用 array_map 更快,后者(显然)必须为每个元素调用一个函数。 我只会将 array_map 用于更复杂的事情,例如高级排序算法等,但绝对不会用于像这样微不足道的事情。
我个人赞同 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 组合。
array_walk($myArray, function(&$v) {$v *= 60;});
当您想要将数字数组与给定因子相乘时:
foreach($numbers as &$n)
$n *= $factor ;
unset($n) ;