如何对多维数组中的所有列值求和?

mar*_*t15 107 php arrays sum multidimensional-array

如何通过关联键添加所有列值?请注意,__CODE__密钥是动态的.

输入数组:

Array
(
    [0] => Array
        (
            [gozhi] => 2
            [uzorong] => 1
            [ngangla] => 4
            [langthel] => 5
        )

    [1] => Array
        (
            [gozhi] => 5
            [uzorong] => 0
            [ngangla] => 3
            [langthel] => 2
        )

    [2] => Array
        (
            [gozhi] => 3
            [uzorong] => 0
            [ngangla] => 1
            [langthel] => 3
        )
)
Run Code Online (Sandbox Code Playgroud)

期望的结果:

Array
(
    [gozhi] => 10
    [uzorong] => 1
    [ngangla] => 8
    [langthel] => 10
)
Run Code Online (Sandbox Code Playgroud)

pot*_*hin 171

您可以使用array_walk_recursive()获得问题的一般案例解决方案(当每个内部数组可能具有唯一键时).

$final = array();

array_walk_recursive($input, function($item, $key) use (&$final){
    $final[$key] = isset($final[$key]) ?  $item + $final[$key] : $item;
});
Run Code Online (Sandbox Code Playgroud)

实施例与array_walk_recursive()对一般的情况下

此外,由于PHP 5.5,你可以使用array_column()函数来实现你想要的结果的精确关键字,[gozhi]例如:

array_sum(array_column($input, 'gozhi')); 
Run Code Online (Sandbox Code Playgroud)

array_column()用于指定键的示例

如果你想用相同的键(你发布的所需结果)得到所有内部数组的总和,你可以做这样的事情(记住第一个内部数组必须具有与其他数组相同的结构)):

$final = array_shift($input);

foreach ($final as $key => &$value){
   $value += array_sum(array_column($input, $key));
}    

unset($value);
Run Code Online (Sandbox Code Playgroud)

示例,array_column()以防所有内部数组具有相同的键

如果你想要一个使用array_column()then 的一般案例解决方案,你可以考虑获得所有唯一的密钥,然后得到每个密钥的总和:

$final = array();

foreach($input as $value)
    $final = array_merge($final, $value);

foreach($final as $key => &$value)
    $value = array_sum(array_column($input, $key));

unset($value);
Run Code Online (Sandbox Code Playgroud)

实施例与array_column()对一般的情况下


Chr*_*s J 85

$sumArray = array();

foreach ($myArray as $k=>$subArray) {
  foreach ($subArray as $id=>$value) {
    $sumArray[$id]+=$value;
  }
}

print_r($sumArray);
Run Code Online (Sandbox Code Playgroud)

  • 由于密钥尚不存在,因此会在第一次迭代时抛出通知. (47认同)
  • 要避免这些注意事项,您可以将$ sumArray的值分配给:array_key_exists($ id,$ sumArray)?$ sumArray [$ id] + = $ value:$ sumArray [$ id] = $ value; (12认同)
  • @RanaMuhammadUsman:如果有'n`数组,请使用[this solution](http://stackoverflow.com/a/9938193/1438393). (2认同)
  • array_reduce对我来说听起来最漂亮http://stackoverflow.com/questions/14195916/associative-array-sum-values-of-the-same-key (2认同)

Gum*_*mbo 28

这是一个类似于其他两个的解决方案:

$acc = array_shift($arr);
foreach ($arr as $val) {
    foreach ($val as $key => $val) {
        $acc[$key] += $val;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这不需要检查数组键是否已经存在并且不会抛出通知.


小智 21

它也可以使用array_map:

$rArray = array(
    0 => array(
        'gozhi' => 2,
        'uzorong' => 1,
        'ngangla' => 4,
        'langthel' => 5
    ),
    1 => array(
        'gozhi' => 5,
        'uzorong' => 0,
        'ngangla' => 3,
        'langthel' => 2
    ),
    2 => array(
        'gozhi' => 3,
        'uzorong' => 0,
        'ngangla' => 1,
        'langthel' => 3
    ),
);

$sumResult = call_user_func_array('array_map', array_merge(['sum'], $rArray));

function sum()
{
    return array_sum(func_get_args());
}
Run Code Online (Sandbox Code Playgroud)


小智 14

使用此代码段:

$key = 'gozhi';
$sum = array_sum(array_column($array,$key));
Run Code Online (Sandbox Code Playgroud)


Gra*_*ton 12

$newarr=array();
foreach($arrs as $value)
{
  foreach($value as $key=>$secondValue)
   {
       if(!isset($newarr[$key]))
        {
           $newarr[$key]=0;
        }
       $newarr[$key]+=$secondValue;
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你投票给某人,请发表评论......如果你不发表评论,就无法改进解决方案. (4认同)
  • 请注意,每次访问赋值右侧的$ newarr [$ key]时,这将为您提供PHP通知(未定义的索引),此时此类值尚不存在. (3认同)

Tod*_*fee 5

另一个版本,下面有一些好处.

$sum = ArrayHelper::copyKeys($arr[0]);

foreach ($arr as $item) {
    ArrayHelper::addArrays($sum, $item);
}


class ArrayHelper {

    public function addArrays(Array &$to, Array $from) {
        foreach ($from as $key=>$value) {
            $to[$key] += $value;
        }
    }

    public function copyKeys(Array $from, $init=0) {
        return array_fill_keys(array_keys($from), $init);
    }

}
Run Code Online (Sandbox Code Playgroud)

我想将Gumbo,Graviton和Chris J的最佳答案与以下目标结合起来,以便我可以在我的应用中使用它:

a)初始化循环外的'sum'数组键(Gumbo).应该有助于在非常大的阵列上进行性能测试(尚未测试!).消除通知.

b)主要逻辑易于理解而无需遵守手册.(Graviton,Chris J).

c)解决使用相同的键添加任意两个数组的值的更一般的问题,并使其更少地依赖于子阵列结构.

与Gumbo的解决方案不同,您可以在值不在子数组中的情况下重复使用它.想象一下,在下面的例子中,$arr1$arr2没有硬编码,但是作为在循环内调用函数的结果返回.

$arr1 = array(
    'gozhi' => 2,
    'uzorong' => 1,
    'ngangla' => 4,
    'langthel' => 5
);

$arr2 = array(
   'gozhi' => 5,
   'uzorong' => 0,
   'ngangla' => 3,
   'langthel' => 2
);

$sum = ArrayHelper::copyKeys($arr1);

ArrayHelper::addArrays($sum, $arr1);
ArrayHelper::addArrays($sum, $arr2);
Run Code Online (Sandbox Code Playgroud)