【问题标题】:How to merge two arrays by summing the merged values [duplicate]如何通过对合并的值求和来合并两个数组[重复]
【发布时间】:2011-08-30 11:39:30
【问题描述】:

可能重复:
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 等来构建一些功能,但我正在寻找更智能、更清洁的解决方案。感谢您的任何指点!

【问题讨论】:

  • 这听起来像是您想要为其编写函数的那种东西。无论如何,我都不会认为它是“笨拙的”,这是一件相当独特的事情。然而,我可能被证明是错误的,但我不相信有任何本机函数可以自己处理这个问题。如果写一个函数是解决办法,你还需要帮助吗?
  • 我相信没有内置函数可以做到这一点,检查这个问题:stackoverflow.com/questions/1496682/…
  • 问题表述错误。 array_merge 确实合并两个数组,同时保留所有。但是您想将两个数组的相同键的相加,这是另一回事。

标签: php arrays sum


【解决方案1】:

没那么复杂 做类似的事情:

$a3 = $a1;

foreach($a2 as $k => $v) {
    if(array_key_exists($k, $a3)) {
       $a3[$k] += $v;
    } else {
       $a3[$k] = $v; 
    }
}

【讨论】:

    【解决方案2】:
    $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;
    }
    

    【讨论】:

    • 现在为什么这被否决了,拜托?它可能看起来很神秘,但前提是你不习惯用集合和函数来思考。 IMO 它比嵌套循环或大量 ifs 优雅得多。
    • 第三种解决方案为我重置了数组键。
    • 为什么我们在第一个函数中检查(isset($a1[$key]) ? $a1[$key] : 0)?我们可以像第二个函数那样直接在那个函数中像$a1[$key] + $a2[$key]那样做吗?
    • @viren 如果两个数组不包含相同的键,则避免 未定义索引 通知。在第二个版本中,我们使用错误抑制运算符来代替。
    【解决方案3】:

    你可以使用array_push函数,希望对你有帮助

    foreach($a2 as $a2){
        array_push($a1, $a2);
        }
    
        print_r($a1);
    
    Output:
    
    Array
    (
        [a] => 2
        [b] => 0
        [c] => 5
        [0] => 3
        [1] => 9
        [2] => 7
        [3] => 10
    )
    

    或 您可以使用数字更改键值中的逻辑。即使它具有相同的数字,它也可以使用,如下所示:

    <?php
    $beginning = array(1 => 'foo');
    $end = array(1 => 'bar');
    $result = array_merge((array)$beginning, (array)$end);
    print_r($result);
    ?>
    
    Output:
    
    Array (
     [0] => foo
     [1] => bar
     )
    

    享受!!!!!!!!!!!!!!!

    【讨论】:

    • -1 你读过这个问题吗?
    【解决方案4】:

    我的贡献:

    function array_merge_numeric_values()
    {
        $arrays = func_get_args();
        $merged = array();
        foreach ($arrays as $array)
        {
            foreach ($array as $key => $value)
            {
                if ( ! is_numeric($value))
                {
                    continue;
                }
                if ( ! isset($merged[$key]))
                {
                    $merged[$key] = $value;
                }
                else
                {
                    $merged[$key] += $value;
                }
            }
        }
        return $merged;
    }
    

    将任意数量的数组传递给它。随意添加更多防御、接受多维数组的能力或类型检查。

    演示:http://codepad.org/JG6zwAap

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      相关资源
      最近更新 更多