-3

I have an array with duplicate key values. How can I sum all duplicate array key values in another new array?

 $array = Array (
           "0" => Array ( "2" => 123 ),
           "1" => Array ( "4" => 45 ),
           "2" => Array ( "3" => 12 ),
           "3" => Array ( "5" => 2 ),
           "4" => Array ( "2" => 12 ),
           "5" => Array ( "4" => 21 ),
           "6" => Array ( "2" => 12 ),
           "7" => Array ( "3" => 21 ),
           "8" => Array ( "2" => 12 ),
           "9" => Array ( "3" => 21 ),
           "10" => Array ( "2" => 2 ),
           "11" => Array ( "4" => 2 ),
           "12" => Array ( "2" => 2 ),
           "13" => Array ( "4" => 2 ),
           "14" => Array ( "3" => 12 ),
           "15" => Array ( "4" => 12 ),
           "16" => Array ( "2" => 12 ),
           "17" => Array ( "2" => 12 ),
           "18" => Array ( "4" => 12 ),
           "19" => Array ( "3" => 12 ),
           "20" => Array ( "2" => 15 ),
           "21" => Array ( "4" => 21 ),
   );

Output will looks like

$newArray = Array
  (
    [2] => 202
    [3] => 78
    [4] => 115
    [5] => 2
  )
2
  • 1
    looks more like not duplicate values but like you wanna sum values by keys Commented Dec 19, 2017 at 7:22
  • yes,i will update Commented Dec 19, 2017 at 7:27

3 Answers 3

3

You can use array_sum and array_column to get the sums of each.

First we have to get all the keys then sum them with array_sum and array_column.

$arr = Array (
    "0" => Array ( "2" => 123 ),
    "1" => Array ( "4" => 45 ),
    "2" => Array ( "3" => 12 ),
    "3" => Array ( "5" => 2 ),
    "4" => Array ( "2" => 12 ),
    "5" => Array ( "4" => 21 ),
    "6" => Array ( "2" => 12 ),
    "7" => Array ( "3" => 21 ),
    "8" => Array ( "2" => 12 ),
    "9" => Array ( "3" => 21 ),
    "10" => Array ( "2" => 2 ),
    "11" => Array ( "4" => 2 ),
    "12" => Array ( "2" => 2 ),
    "13" => Array ( "4" => 2 ),
    "14" => Array ( "3" => 12 ),
    "15" => Array ( "4" => 12 ),
    "16" => Array ( "2" => 12 ),
    "17" => Array ( "2" => 12 ),
    "18" => Array ( "4" => 12 ),
    "19" => Array ( "3" => 12 ),
    "20" => Array ( "2" => 15 ),
    "21" => Array ( "4" => 21 ),
);

// find all subarray keys (2,3,4,5)
foreach($arr as $subarr){
    $keys[] = key($subarr);
}

// remove duplicate keys
$keys = array_unique($keys);

// sum values with same key from $arr and save to $sums
foreach($keys as $key){
    $sums[$key] = array_sum(array_column($arr,$key));    
}

var_dump($sums);

https://3v4l.org/F3RJr


The code can be made shorter like this:

foreach($arr as $subarr){
    $key = key($subarr);
    if(!isset($sums[$key])){
        $sums[$key] = array_sum(array_column($arr,$key));        
    }
}
var_dump($sums);

but I'm not sure it's faster. Maybe...

Sign up to request clarification or add additional context in comments.

Comments

1

You can use array_walk_recursive()

$result = [];

array_walk_recursive($array, function($v, $k) use (&$result) {
    if (!isset($result[$k])) {
        $result[$k] = $v;
    } else {
        $result[$k] += $v;
    }
});

print_r($result);

Comments

0

Check the below code.

$output = array();
$keyarray = array();
foreach($arr as $key => $val){
    if(is_array($val)){
        $key = key($val);
        if(in_array($key,$keyarray)) {
            $output[$key] = $output[$key]+$val[$key];
        } else {
            $keyarray[] = $key;
            $output[$key] = $val[$key];
        }
    }
}

print_r($output);

print_r($output); will give you the expected result.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.