Search code examples
phparraysmultidimensional-arraysumgrouping

Group qualifying multidimensional array data and sum a column of values


I have an array with dynamic values. The goal is to merge the subarrays which have same code and sum of cost value with same code.

$array = [
    [
        ['code'=>'AA', 'name'=>'A Name', 'cost'=>'10'],
        ['code'=>'AB', 'name'=>'B Name', 'cost'=>'15'],
    ],
    [
        ['code'=>'AA', 'name'=>'A Name', 'cost'=>'15'],
        ['code'=>'AB', 'name'=>'B Name', 'cost'=>'10'],
        ['code'=>'AC', 'name'=>'C Name', 'cost'=>'10'],
    ],
    [
        ['code'=>'AA', 'name'=>'A Name', 'cost'=>'5'],
        ['code'=>'AB', 'name'=>'B Name', 'cost'=>'10'],
        ['code'=>'AC', 'name'=>'C Name', 'cost'=>'15'],
    ]
];

Desired result:

[
    [
        ['code'=>'AA', 'name'=>'A Name', 'cost'=>'30'],
        ['code'=>'AB', 'name'=>'B Name', 'cost'=>'35'],
    ]
]

The result is only code AA and BB because code AC not exist on first index. Then cost values within each group are summed.


Solution

  • Demo

    $array = array(
                array(
                    array(
                        'code'=>'AA',
                        'name'=>'A Name',
                        'cost'=>'10',
                    ),
                    array(
                        'code'=>'AB',
                        'name'=>'B Name',
                        'cost'=>'15',
                    ),
                ),
                array(
                    array(
                        'code'=>'AA',
                        'name'=>'A Name',
                        'cost'=>'15',
                    ),
                    array(
                        'code'=>'AB',
                        'name'=>'B Name',
                        'cost'=>'10',
                    ),
                    array(
                        'code'=>'AC',
                        'name'=>'C Name',
                        'cost'=>'10',
                    ),
                ),
                array(
                    array(
                        'code'=>'AA',
                        'name'=>'A Name',
                        'cost'=>'5',
                    ),
                    array(
                        'code'=>'AB',
                        'name'=>'B Name',
                        'cost'=>'10',
                    ),
                    array(
                        'code'=>'AC',
                        'name'=>'C Name',
                        'cost'=>'15',
                    ),
                ),
            );      
    
            $the_biggest_number=count($array);
    
            $new_array = array();
            foreach ($array as $key => $val) {
    
                foreach ($val as $sub_key => $sub_val) {
                    if(!isset($new_array[$sub_val['code']])){
                            $sub_val['count']=1;
                            $new_array[$sub_val['code']]=$sub_val;
                    }
                    else{
                        $new_array[$sub_val['code']]['cost'] += $sub_val['cost'];
                        $new_array[$sub_val['code']]['count'] += 1;
                    }
                }
            }        
    
            $result=array();
            foreach ($new_array as $key => $val) {
                if($val['count']==$the_biggest_number){
                    unset($val['count']);
                    $result[]=$val;
                }
            }
    
            $result= array($result);
    
            echo '<pre>';
            print_r($result);