简体   繁体   中英

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.

  <?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);

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM