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

19

我有一个名为$times的数组。它是一列小数(15,14,11,9,3,2),这些将由用户提交,并且应该是分钟数。由于PHP时间按秒计算,我想通过60来乘以数组中的每个元素。

我已经尝试使用array_walkarray_map进行操作,但我无法使其工作。


如果您不想使用foreach或自定义函数,我会选择Gordon提供的array_map / bcmul解决方案。但是,您是否考虑过将数组乘以60,而是将PHP时间除以60? - Alix Axel
我打算尝试所有的例子,这样我将来就知道如何做了。foreach循环似乎是最简单的。=和之间有什么区别? - Sabai
Henryz:$a *= 6 是 $a = $a * 6 的简写形式。 - lamas
5个回答

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也没有任何问题。

array_map 返回修改后的数组是错误的,在您的示例中,您必须执行 $input = array_map... 否则它不会修改 $input。这时应该使用 array_walk - DrLightman

11

使用 foreach 循环遍历数组并进行乘法操作:

foreach ($times as $value) {

  $new_times[] = $value * 60;

}

6
您可以在这种情况下使用foreach来简化代码:

您可以在这种情况下使用foreach来简化代码:

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

我假设你想要乘法的是数组的值,而不是键。由于上面的解决方案使用了引用,它会改变您原始的数组 - 但是,既然您之前考虑使用array_map,我认为您是想要这样。该解决方案可能比使用array_map更易于理解,而且很可能更快,因为后者显然必须为每个元素调用一个函数。对于更复杂的事情,比如高级排序算法等,我会使用array_map,但绝不会用于像这样琐碎的事情。

在PHP 7.2.6中不再起作用:“迭代器不能通过引用与foreach一起使用” - Tom

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

1
虽然这段代码片段可能解决了问题,但包括解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您的代码建议原因。- 来自审查 - Ferrybig

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组合的原因。


嗨,谢谢回答,这似乎只有在构建一个新数组时才有效,就像这样v=[]。不确定为什么:S - Sabai
因为你必须将 array_map 返回的值分配给一个变量来保存修改后的值。如果你想要重复使用同一个 $input_array,可以将其赋值为 array_map... - DrLightman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接