【问题标题】:Best method for sum two arrays [closed]对两个数组求和的最佳方法[关闭]
【发布时间】:2013-03-11 01:15:37
【问题描述】:

我有两个数组:

$a = array(10, 2, 5, 10, 0);
$b = array(1, 20, 11, 8, 3);

我需要总结一下,得到结果:

$c = array(11, 22, 16, 18, 3);

关于如何在没有“foreach”的情况下执行此操作的任何建议?

【问题讨论】:

  • What have you tried? 请参阅ask advice。 (这是基本的 PHP)
  • 您需要将$a的每个元素添加到数组$b的对应元素中并得到结果。
  • 我想知道最好的方法。我知道如何通过循环来做到这一点。
  • 我使用 array_merge_recursive() 将所有数组递归合并为一个,我使用 foreach 拆分每个内部数组并使用 array_sum() 对内部数组求和。现在我只有一个添加了所有数组的数组。这仅适用于具有相同索引的数组!

标签: php arrays sum


【解决方案1】:

一个简单的方法可能是

$c = array_map(function () {
    return array_sum(func_get_args());
}, $a, $b);

print_r($c);

或者如果你可以使用 PHP5.6,你也可以使用像这样的可变参数函数

$c = array_map(function (...$arrays) {
    return array_sum($arrays);
}, $a, $b);

print_r($c);

输出

Array
(
    [0] => 11
    [1] => 22
    [2] => 16
    [3] => 18
    [4] => 3
)

【讨论】:

  • 第二种方法不需要 PHP 7。自 PHP 5.6 起提供参数解包 (php.net/manual/en/…)。
  • @flu 感谢您的提示 - 刚刚对其进行了测试并更新了我的答案
  • 来自php.net/manual/en/function.array-map.php:“当且仅当仅传递一个数组时,返回的数组将保留数组参数的键。如果传递了多个数组,则返回的数组将具有顺序整数钥匙。”这意味着不保留数组键。
  • 我最喜欢的两个答案。可变参数解决方案是我最喜欢的。实际上,它导致下一步:将 $a 和 $b 作为另一个数组的元素附加,例如 $x,然后添加 ...$x 作为 array_map 的第二个参数。它允许 array_map 处理未定义数量的数组。在处理数据集时不是真正需要但非常有用
【解决方案2】:

如果没有您要求的“foreach”,您将无法做到这一点,您需要在两个数组上循环以获取各自的值。

使用 foreach 的函数是:

function sum_arrays($array1, $array2) {
    $array = array();
    foreach($array1 as $index => $value) {
        $array[$index] = isset($array2[$index]) ? $array2[$index] + $value : $value;
    }
    return $array;
}

现在你只需要这样做:

$c = sum_arrays($a, $b);

【讨论】:

    【解决方案3】:

    试试看

    $c = array();
    foreach (array_keys($a + $b) as $key) {
        $c[$key] = $a[$key] + $b[$key];
    }
    

    【讨论】:

    • 虽然没有在这个问题中特别询问。此解决方案(与其他答案不同)保留数组键,甚至处理不同长度或不同键的数组
    【解决方案4】:
    $c = array();
    for($i=0;$i<count($a);$i++) {
      $c[$i] = $a[$i]+$b[$i];
    }
    

    【讨论】:

    • 这个问题和解决方案可能很基本,但请始终在每个答案中包含一些解释。告诉 OP 和未来的研究人员你的代码是如何工作的以及为什么它是可取的。
    猜你喜欢
    • 2013-06-28
    • 1970-01-01
    • 2019-11-27
    • 2021-01-26
    • 1970-01-01
    • 2017-08-28
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多