How to sum all column values in multi-dimensional array?

后端 未结 20 2510
花落未央
花落未央 2020-11-22 00:57

How can I add all the columnar values by associative key? Note that key sets are dynamic.

Input array:

Arr         


        
相关标签:
20条回答
  • We need to check first if array key does exist.

    CODE:

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

    OUTPUT With Array Key Validation:

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

    OUTPUT Without Array Key Validation:

    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
    )
    

    This is a bad practice although it prints the output. Always check first if key does exist.

    0 讨论(0)
  • 2020-11-22 01:19

    Use this snippet:

    $key = 'gozhi';
    $sum = array_sum(array_column($array,$key));
    
    0 讨论(0)
  • 2020-11-22 01:19
    $newarr=array();
    foreach($arrs as $value)
    {
      foreach($value as $key=>$secondValue)
       {
           if(!isset($newarr[$key]))
            {
               $newarr[$key]=0;
            }
           $newarr[$key]+=$secondValue;
       }
    }
    
    0 讨论(0)
  • 2020-11-22 01:20

    You can try this:

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

    and finally:

    print_r($c);
    
    0 讨论(0)
  • 2020-11-22 01:20

    this works great on my laravel project

    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
    
    0 讨论(0)
  • 2020-11-22 01:21

    For those who landed here and are searching for a solution that merges N arrays AND also sums the values of identical keys found in the N arrays, I've written this function that works recursively as well. (See: https://gist.github.com/Nickology/f700e319cbafab5eaedc)

    Example:

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

    Will result in:

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

    Here's the code:

    <?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;
    
    }
    
    ?>
    
    0 讨论(0)
提交回复
热议问题