Search code examples
phparraysmultidimensional-arraysumgrouping

Array value sum by key value php


How can I check columnar values by associative key?

I want to check data by "building_id" . Here I have 2 buildings then I want rent data as sum with group by "tenancy_rate"

Input array :

Array
(
[0] => Array
    (
        [id] => 34
        [building_id] => 786
        [tenancy_rate] => 0
        [rent_per_room] => 10000
        [management_fee_per_room] => 0
    )

[1] => Array
    (
        [id] => 35
        [building_id] => 786
        [tenancy_rate] => 10
        [rent_per_room] => 11810
        [management_fee_per_room] => 5400
        [rent] => 86050
    )

[2] => Array
    (
        [id] => 36
        [building_id] => 786
        [tenancy_rate] => 20
        [rent_per_room] => 11810
        [management_fee_per_room] => 5400
        [rent] => 86050
    )
[3] => Array
    (
        [id] => 56
        [building_id] => 798
        [tenancy_rate] => 0
        [rent_per_room] => 10000
        [management_fee_per_room] => 5400
        [rent] => 77000
    )

[4] => Array
    (
        [id] => 57
        [building_id] => 798
        [tenancy_rate] => 10
        [rent_per_room] => 11810
        [management_fee_per_room] => 5400
        [rent] => 86050
    )

[5] => Array
    (
        [id] => 58
        [building_id] => 798
        [tenancy_rate] => 20
        [rent_per_room] => 11810
        [management_fee_per_room] => 5400
        [rent] => 86050
    )

)

Desired result :

Array
(
[0] => Array
    (
        [tenancy_rate] => 0
        [rent] => 77000
    )

[1] => Array
    (
        [tenancy_rate] => 10
        [rent] => 172100
    )

[2] => Array
    (
        [tenancy_rate] => 20
        [rent] => 172100
    )

)

For this I tried PHP code

But not getting any solution

$sumArray = array();

foreach ($myArray as $k=>$subArray) {
  foreach ($subArray as $id=>$value) {
    $sumArray[$id]+=$value;
  }
}

print_r($sumArray);

Solution

  • You can use foreach and group by index tenancy_rate

    $f = [];
    foreach($a as $v){
      if(!empty($f[$v['tenancy_rate']])){
        $f[$v['tenancy_rate']]['rent'] += $v['rent'];
      }else{
        $f[$v['tenancy_rate']] = [
                'tenancy_rate' => $v['tenancy_rate'],
                'rent'         => isset($v['rent']) ? $v['rent'] : 0
            ];
      }
    }
    

    Working example :- https://3v4l.org/nWRGA

    You can use array_values to re arrange the order of array