php - 如何通过对合并值求和来合并两个数组

标签 php arrays sum

<分区>

Possible Duplicate:
PHP: How to sum values of the array of the same key

我正在寻找一个 array_merge() 函数,它不会替换值,而是添加它们。

例如,这是我正在尝试的代码:

    echo "<pre>"; 

    $a1 = array(
         "a" => 2
        ,"b" => 0
        ,"c" => 5
    );

    $a2 = array(
         "a" => 3
        ,"b" => 9
        ,"c" => 7
        ,"d" => 10
    );

    $a3 = array_merge($a1, $a2);
    print_r($a3); 

遗憾的是,这会输出:

Array
(
    [a] => 3
    [b] => 9
    [c] => 7
    [d] => 10
)

然后我尝试,而不是array_merge,只是简单地添加两个数组

$a3 = $a1 + $a2;

但是这个输出

Array
(
    [a] => 2
    [b] => 0
    [c] => 5
    [d] => 10
)

我真正想要的是能够根据需要传递尽可能多的数组,然后得到它们的总和。所以在我的示例中,我希望输出为:

Array
(
    [a] => 5
    [b] => 9
    [c] => 12
    [d] => 10
)

当然,我可以使用许多 foreach 等来安排和构建一些功能,但我正在寻找更智能、更清洁的解决方案。感谢您的指点!

最佳答案

$sums = array();
foreach (array_keys($a1 + $a2) as $key) {
    $sums[$key] = (isset($a1[$key]) ? $a1[$key] : 0) + (isset($a2[$key]) ? $a2[$key] : 0);
}

可以使用错误抑制运算符将其缩短为以下内容,但它应该被认为是丑陋的:

$sums = array();
foreach (array_keys($a1 + $a2) as $key) {
    $sums[$key] = @($a1[$key] + $a2[$key]);
}

或者,一些映射:

$keys = array_fill_keys(array_keys($a1 + $a2), 0);
$sums = array_map(function ($a1, $a2) { return $a1 + $a2; }, array_merge($keys, $a1), array_merge($keys, $a2));

或两种解决方案的组合:

$sums = array_fill_keys(array_keys($a1 + $a2), 0);
array_walk($sums, function (&$value, $key, $arrs) { $value = @($arrs[0][$key] + $arrs[1][$key]); }, array($a1, $a2));

我认为这些足够简洁,可以在需要时在现场调整其中一个,但可以将其描述为一个接受无限数量的数组并对它们求和的函数:

function array_sum_identical_keys() {
    $arrays = func_get_args();
    $keys = array_keys(array_reduce($arrays, function ($keys, $arr) { return $keys + $arr; }, array()));
    $sums = array();

    foreach ($keys as $key) {
        $sums[$key] = array_reduce($arrays, function ($sum, $arr) use ($key) { return $sum + @$arr[$key]; });
    }
    return $sums;
}

关于php - 如何通过对合并值求和来合并两个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6086267/

相关文章:

excel - 如何仅使用 1 个公式通过 vlookup 对 2 行的值求和?

php - 动态设置 Kohana 模板名称

javascript - 获取 SQL 表值的最有效方法是什么?

PHP Laravel : How to logout from other device with same userId forcefully

javascript - 在 ng-bind Angular Js 中使用 ng-if

ruby - 使用#inject 连接数组中的字符串

php - 未定义的偏移错误,构建数组的新功能

php - 如何让 Dropdown 返回文本值而不是索引值

php - mysql 的总和值

r - 在R中: how to sum a variable by group between two dates