Mukhila Asokan
Mukhila Asokan

Reputation: 643

how to calculate the sum of same array values in PHP

I have an array like this

$estimate[0]=>
'gear' =>'MMG'
'total' =>  315
   'efforts' => 9
   'afh' => 18

$estimate[1]=>
    'gear' =>'MMG'
    'total' =>  400
       'efforts' => 2
       'afh' => 6

$estimate[2]=>
    'gear' =>'BOO'
    'total' =>  200
       'efforts' => 20
       'afh' => 16

$estimate[3]=>
    'gear' =>'BOB'
    'total' =>  250
       'efforts' => 20
       'afh' => 16

I want to calculate the sum of total, efforts and afh in which gear is same and it will be stored in the another array. Following my coding is working when the array (estimate) size is less than 5.

$calculate = array();   
for($et=0;$et<count($estimate);):   
if($et==0):
    $calculate[$et]['gear'] = $estimate[$et]['gear'];
    $calculate[$et]['total'] = $estimate[$et]['total'];
    $calculate[$et]['efforts'] = $estimate[$et]['efforts'];
    $calculate[$et]['afh'] = $estimate[$et]['afh'];                 
    goto loopend;
endif;
for($cet=0;$cet<count($calculate);$cet++):
    if($estimate[$et]['gear'] == $calculate[$cet]['gear']):
        $calculate[$cet]['total'] = $calculate[$cet]['total'] + $estimate[$et]['total'];
        $calculate[$cet]['efforts'] = $calculate[$cet]['efforts'] + $estimate[$et]['efforts'];
        $calculate[$cet]['afh']    = $calculate[$cet]['afh'] + $estimate[$et]['afh'];                       
        goto loopend;   
    endif;
endfor;
    $calculate[$et]['gear'] = $estimate[$et]['gear'];
    $calculate[$et]['total'] = $estimate[$et]['total'];
    $calculate[$et]['efforts'] = $estimate[$et]['efforts'];
    $calculate[$et]['afh'] = $estimate[$et]['afh'];                 
    goto loopend;
loopend:$et++;  
endfor; 

The coding is not working more than many gears. Sometimes it works. I can't find the issues. Please help me to solve the issues.

Upvotes: 0

Views: 156

Answers (3)

The fourth bird
The fourth bird

Reputation: 163207

You might use array_reduce:

$result = array_reduce($estimate, function($carry, $item) {
    if (!isset($carry[$item["gear"]])) {
        $carry[$item["gear"]] = $item;
        return $carry;
    }

    $carry[$item["gear"]]["total"] += $item["total"];
    $carry[$item["gear"]]["efforts"] += $item["efforts"];
    $carry[$item["gear"]]["afh"] += $item["afh"];

    return $carry;
});

Demo

Upvotes: 1

Ash-b
Ash-b

Reputation: 713

  <?php 

  $new_arr = array();
  $estimate[0] =array(
    'gear' =>'MMG',
    'total' =>  315,
    'efforts' => 9,
    'afh' => 18
  );
  $estimate[1]=array(
    'gear' =>'MMG',
    'total' =>  400,
    'efforts' => 2,
    'afh' => 6,
  );
  $estimate[2]=array(
    'gear' =>'BOO',
    'total' =>  200,
    'efforts' => 20,
    'afh' => 16,
  );
  $estimate[3]=array(
    'gear' =>'BOB',
    'total' =>  250,
    'efforts' => 20,
    'afh' => 16,
  );

  foreach ($estimate as $key => $value) {
   $new_arr[$value['gear']] = array(
      'total'   =>  (isset($new_arr[$value['gear']]['total']) ? ($new_arr[$value['gear']]['total']  + $value['total']) : $value['total'] ),
      'efforts' =>  (isset($new_arr[$value['gear']]['efforts']) ? ($new_arr[$value['gear']]['efforts']  + $value['efforts']) : $value['efforts'] ),
      'afh'     =>  (isset($new_arr[$value['gear']]['afh']) ? ($new_arr[$value['gear']]['afh']  + $value['afh']) : $value['afh'] )
   );
  }


  echo "<pre>";print_r($new_arr);

Upvotes: 1

Bilal Ahmed
Bilal Ahmed

Reputation: 4066

As per my comment use foreach loop when your array length is not define

Here is your desired code

   <?php
 $estimate = array( 
            "0" => array (
               "gear" => 35,
               "total" => 30,   
               "efforts" => 39,
               "afh" => 39,
            ),

           "1" => array (
               "gear" => 35,
               "total" => 30,   
               "efforts" => 39,
               "afh" => 39,
            ),

            "2" => array (
               "gear" => 35,
               "total" => 30,   
               "efforts" => 39,
               "afh" => 39,
            ),
         );
 $gear=0;
 $total=0;
 $efforts=0;
 $afh=0;
 foreach ($estimate as $key => $value) {
        $gear=$gear+$value['gear'];
        $total=$gear+$value['total'];
        $efforts=$gear+$value['efforts'];
        $afh=$gear+$value['afh'];
 }
 echo "<pre>";
 $result = array('gear' => $gear, 'total' => $total,'efforts' => $efforts,'afh' => $afh);
 echo "<pre>";
print_r($result);

you can check the result HERE

Upvotes: 1

Related Questions