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

后端 未结 20 2574
花落未央
花落未央 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条回答
  •  太阳男子
    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:

    
     * @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;
    
    }
    
    ?>
    

提交回复
热议问题