1

I want to sum an array and grouping them by its key value.

this is the array :

Array
(
    [0] => Array
        (
            [delivery_plan] => 80::2020/07
            [additional_amount_usd] => 32.88
        )

    [1] => Array
        (
            [delivery_plan] => 80::2020/09
            [additional_amount_usd] => 16.44
        )

    [2] => Array
        (
            [delivery_plan] => 80::2020/07
            [additional_amount_usd] => 32.88
        )

)

I want output to be like this :

Array
(
    [0] => Array
        (
            [delivery_plan] => 80::2020/07
            [additional_amount_usd] => 65.76
        )

    [1] => Array
        (
            [delivery_plan] => 80::2020/09
            [additional_amount_usd] => 16.44
        )

I have tried using this code, but the output different from my expected result :

$arr = [];
foreach ($section_balance as $sb => $val) {
  if(array_key_exists($sb, $arr)){
    $arr[$sb] += array_sum($val);
  } else {
    $arr[$sb] = array_sum($val);
  }
}

i've got tis result instead :

Array
(
    [0] => 112.88
    [1] => 96.44
    [2] => 112.88
)

How can i solve this ?

owf
  • 245
  • 1
  • 9
  • 26

1 Answers1

2

This is one way to do it breaking it down into steps...

1.Create the Array that sums the matching delivery_plans

2.Rebuild the Array as required

<?php
$sum_array = [];
foreach($array as $item) {
    if (key_exists($item['delivery_plan'], $sum_array)) {
        $sum_array[$item['delivery_plan']] += $item['additional_amount_usd'];
    } else {
        $sum_array[$item['delivery_plan']] = $item['additional_amount_usd'];
    }
}

$final_array = [];
foreach($sum_array as $key => $value) {
    $final_array[] = ['delivery_plan' => $key, 'additional_amount_usd' => $value];
}

Refactoring the above so the code is not dependant upon hardcoded index names...

$key_name = 'delivery_plan';
$value_name = 'additional_amount_usd';

$sum_array = [];
foreach($array as $item) {
    if (key_exists($item[$key_name], $sum_array)) {
        $sum_array[$item[$key_name]] += $item[$value_name];
    } else {
        $sum_array[$item[$key_name]] = $item[$value_name];
    }
}

$final_array = [];
foreach($sum_array as $key => $value) {
    $final_array[] = [$key_name => $key, $value_name => $value];
}

And you could then turn that into a function if you so desired...

The result is (using var_dump())

array(2) {
  [0]=>
  array(2) {
    ["delivery_plan"]=>
    string(13) "80::2020 / 07"
    ["additional_amount_usd"]=>
    float(65.76)
  }
  [1]=>
  array(2) {
    ["delivery_plan"]=>
    string(13) "80::2020 / 09"
    ["additional_amount_usd"]=>
    float(16.44)
  }
}

Update: Also Take a look at the solution provided by Kevin. 3v4l.org/h9Q5L

TimBrownlaw
  • 5,457
  • 3
  • 24
  • 28