代码之家  ›  专栏  ›  技术社区  ›  marknt15

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

  •  97
  • marknt15  · 技术社区  · 15 年前

    如何通过关联键添加所有列值?注意 [gozhi] 关键是 动态 .

    输入数组:

    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
            )
    )
    

    预期结果:

    Array
    (
        [gozhi] => 10
        [uzorong] => 1
        [ngangla] => 8
        [langthel] => 10
    )
    
    18 回复  |  直到 6 年前
        1
  •  82
  •   Chris J    15 年前
    $sumArray = array();
    
    foreach ($myArray as $k=>$subArray) {
      foreach ($subArray as $id=>$value) {
        $sumArray[$id]+=$value;
      }
    }
    
    print_r($sumArray);
    
        2
  •  148
  •   potashin    10 年前

    你可以使用 array_walk_recursive() 为您的问题找到一个通用的案例解决方案( 当每个内部数组可能具有唯一键时 )

    $final = array();
    
    array_walk_recursive($input, function($item, $key) use (&$final){
        $final[$key] = isset($final[$key]) ?  $item + $final[$key] : $item;
    });
    

    Example with array_walk_recursive() for the general case

    还有,因为 PHP 5.5 你可以使用 array_column() 实现所需结果的函数 为了准确的钥匙 ,请 [gozhi] 例如:

    array_sum(array_column($input, 'gozhi')); 
    

    Example with array_column() for the specified key

    如果要获取具有相同键的所有内部数组的总和( 您发布的期望结果 )你可以这样做。( 记住,第一个内部数组必须具有与其他数组相同的结构 ):

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

    Example with array_column() in case all inner arrays have the same keys

    如果您希望使用 列列() 然后,首先考虑获取所有唯一的键,然后获取每个键的总和:

    $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);
    

    Example with array_column() for the general case

        3
  •  27
  •   Gumbo    15 年前

    这里有一个与其他两个类似的解决方案:

    $acc = array_shift($arr);
    foreach ($arr as $val) {
        foreach ($val as $key => $val) {
            $acc[$key] += $val;
        }
    }
    

    但这不需要检查数组键是否已经存在,也不需要发送通知。

        4
  •  21
  •   sanmai    7 年前

    也可以使用 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());
    }
    
        5
  •  12
  •   Graviton    15 年前
    $newarr=array();
    foreach($arrs as $value)
    {
      foreach($value as $key=>$secondValue)
       {
           if(!isset($newarr[$key]))
            {
               $newarr[$key]=0;
            }
           $newarr[$key]+=$secondValue;
       }
    }
    
        6
  •  7
  •   likeitlikeit Srivathsa Harish Venkataramana    7 年前

    使用此代码段:

    $key = 'gozhi';
    $sum = array_sum(array_column($array,$key));
    
        7
  •  5
  •   Todd Chaffee    13 年前

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

    $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);
        }
    
    }
    

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

    a)在循环(gumbo)外初始化“sum”数组键。应该有助于提高超大阵列的性能(尚未测试!).取消通知。

    b)主逻辑易于理解,无需点击手册。(格雷斯顿,克里斯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);
    
        8
  •  4
  •   potashin    10 年前

    也可以使用 array_walk :

    function array_sum_values(array $input, $key) {
       $sum = 0;
       array_walk($input, function($item, $index, $params) {
             if (!empty($item[$params[1]]))
                $params[0] += $item[$params[1]];
          }, array(&$sum, $key)
       );
       return $sum;
    }
    
    var_dump(array_sum_values($arr, 'gozhi'));
    

    不像以前的解决方案那样可读,但它可以工作:)

        9
  •  3
  •   Bollis    11 年前

    这里有一个版本,其中两个数组的数组键可能不相同,但您希望它们都在最终数组中。

    function array_add_by_key( $array1, $array2 ) {
        foreach ( $array2 as $k => $a ) {
            if ( array_key_exists( $k, $array1 ) ) {
                $array1[$k] += $a;
            } else {
                $array1[$k] = $a;
            }
        }
        return $array1;
    }
    
        10
  •  2
  •   Bluetree    7 年前

    我们需要首先检查数组键是否存在。

    代码:

    $sum = array();
    foreach ($array as $key => $sub_array) {
        foreach ($sub_array as $sub_key => $value) {
    
            //If array key doesn't exists then create and initize first before we add a value.
            //Without this we will have an Undefined index error.
            if( ! array_key_exists($sub_key, $sum)) $sum[$sub_key] = 0;
    
            //Add Value
            $sum[$sub_key]+=$value;
        }
    }
    print_r($sum);
    

    带数组键验证的输出:

    Array
    (
        [gozhi] => 10
        [uzorong] => 1
        [ngangla] => 8
        [langthel] => 10
    )
    

    不带数组键验证的输出:

    Notice: Undefined index: gozhi in F:\web\index.php on line 37
    
    Notice: Undefined index: uzorong in F:\web\index.php on line 37
    
    Notice: Undefined index: ngangla in F:\web\index.php on line 37
    
    Notice: Undefined index: langthel in F:\web\index.php on line 37
    
    Array
    (
        [gozhi] => 10
        [uzorong] => 1
        [ngangla] => 8
        [langthel] => 10
    )
    

    这是一个糟糕的实践,尽管它打印输出。如果密钥确实存在,请始终首先检查。

        11
  •  0
  •   Nick    9 年前

    对于那些在这里登陆并正在寻找合并解决方案的人 n个数组 并且对n数组中相同键的值求和,我已经编写了这个函数,它也可以递归地工作。(见: https://gist.github.com/Nickology/f700e319cbafab5eaedc )

    例子:

    $a = array( "A" => "bob", "sum" => 10, "C" => array("x","y","z" => 50) );
    $b = array( "A" => "max", "sum" => 12, "C" => array("x","y","z" => 45) );
    $c = array( "A" => "tom", "sum" =>  8, "C" => array("x","y","z" => 50, "w" => 1) );
    
    print_r(array_merge_recursive_numeric($a,$b,$c));
    

    将导致:

    Array
    (
        [A] => tom
        [sum] => 30
        [C] => Array
            (
                [0] => x
                [1] => y
                [z] => 145
                [w] => 1
            )
    
    )
    

    代码如下:

    <?php 
    /**
     * array_merge_recursive_numeric function.  Merges N arrays into one array AND sums the values of identical keys.
     * WARNING: If keys have values of different types, the latter values replace the previous ones.
     * 
     * Source: https://gist.github.com/Nickology/f700e319cbafab5eaedc
     * @params N arrays (all parameters must be arrays)
     * @author Nick Jouannem <nick@nickology.com>
     * @access public
     * @return void
     */
    function array_merge_recursive_numeric() {
    
        // Gather all arrays
        $arrays = func_get_args();
    
        // If there's only one array, it's already merged
        if (count($arrays)==1) {
            return $arrays[0];
        }
    
        // Remove any items in $arrays that are NOT arrays
        foreach($arrays as $key => $array) {
            if (!is_array($array)) {
                unset($arrays[$key]);
            }
        }
    
        // We start by setting the first array as our final array.
        // We will merge all other arrays with this one.
        $final = array_shift($arrays);
    
        foreach($arrays as $b) {
    
            foreach($final as $key => $value) {
    
                // If $key does not exist in $b, then it is unique and can be safely merged
                if (!isset($b[$key])) {
    
                    $final[$key] = $value;
    
                } else {
    
                    // If $key is present in $b, then we need to merge and sum numeric values in both
                    if ( is_numeric($value) && is_numeric($b[$key]) ) {
                        // If both values for these keys are numeric, we sum them
                        $final[$key] = $value + $b[$key];
                    } else if (is_array($value) && is_array($b[$key])) {
                        // If both values are arrays, we recursively call ourself
                        $final[$key] = array_merge_recursive_numeric($value, $b[$key]);
                    } else {
                        // If both keys exist but differ in type, then we cannot merge them.
                        // In this scenario, we will $b's value for $key is used
                        $final[$key] = $b[$key];
                    }
    
                }
    
            }
    
            // Finally, we need to merge any keys that exist only in $b
            foreach($b as $key => $value) {
                if (!isset($final[$key])) {
                    $final[$key] = $value;
                }
            }
    
        }
    
        return $final;
    
    }
    
    ?>
    
        12
  •  0
  •   Luis González    9 年前

    你知道我通常是怎么做这种手术的。

    // We declare an empty array in wich we will store the results
    $sumArray = array();
    
    // We loop through all the key-value pairs in $myArray
    foreach ($myArray as $k=>$subArray) {
    
       // Each value is an array, we loop through it
       foreach ($subArray as $id=>$value) {
    
           // If $sumArray has not $id as key we initialize it to zero  
           if(!isset($sumArray[$id])){
               $sumArray[$id] = 0;
           }
    
           // If the array already has a key named $id, we increment its value
           $sumArray[$id]+=$value;
        }
     }
    
     print_r($sumArray);
    
        13
  •  0
  •   Anax    9 年前

    您可以尝试以下操作:

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

    最后:

    print_r($c);
    
        14
  •  0
  •   Maurice Wagura    7 年前

    这对我的Laravel项目很有用

    print_r($Array); // your original array
    
    $_SUM = [];
    
    // count($Array[0]) => if the number of keys are equall in all arrays then do a count of index 0 etc.
    for ($i=0; $i < count($Array[0]); $i++) {
        $_SUM[] = $Array[0][$i] + $Array[1][$i]; // do a for loop on the count 
    }
    
    print_r($_SUM); // get a sumed up array
    
        15
  •  0
  •   Progrock    6 年前

    检查数组中的每一项,如果值存在,则将其和到以前的值(如果不只是赋值)。

    <?php
    $array = 
    [
        [
            'a'=>1,
            'b'=>1,
            'c'=>1,
        ],
        [
            'a'=>2,
            'b'=>2,
        ],
        [
            'a'=>3,
            'd'=>3,
        ]
    ];
    
    $result = array_reduce($array, function($carry, $item) {
        foreach($item as $k => $v)
            $carry[$k] = isset($carry[$k]) ? $carry[$k] + $v : $v;
    
        return $carry;
    }, []);
    
    print_r($result);
    

    输出:

    Array
    (
        [a] => 6
        [b] => 3
        [c] => 1
        [d] => 3
    )
    
        16
  •  -1
  •   Marc LukeHennerley    8 年前
    $sumArray = array();
    foreach ($myArray as $k => $subArray) {
        foreach ($subArray as $id => $value) {
            if (!isset($sumArray[$id])) {
                $sumArray[$id] = 0;
            }
            $sumArray[$id]+=$value;
        }
    }
    
        17
  •  -1
  •   Soliman Mahmoud Soliman    7 年前
    $sumArray = array();
    
    foreach ($myArray as $k=>$subArray) {
      foreach ($subArray as $id=>$value) {
        if(!isset($sumArray[$id])){
         $sumArray[$id] =$value;
        }else {
         $sumArray[$id]+=$value;
        }
      }
    }
    
    print_r($sumArray);
    
    `
    
        18
  •  -1
  •   Brian Tompsett - 汤莱恩 andrewwong97    6 年前

    例如,您可以从下面这样的结果中提取所有字段。

    我从数组中提取“余额”并保存到变量中

    $kii =   $user->pluck('balance');
    

    然后在下一行,你可以这样求和:

    $sum =  $kii->sum(); 
    

    希望它有帮助。