0

Hi I have structure array like as

array:2 [
  0 => array:3 [
    "title" => "samba"
    "diff" => "06:30:00"
    "user" => "Janek"
  ]
  1 => array:3 [
    "title" => "Ramba"
    "diff" => "03:30:00"
    "user" => "Janek"
  ]
  2 => array:3 [
    "title" => "fit"
    "diff" => "03:30:00"
    "user" => "Pawel"
  ]
]

output should be

array:2 [
  0 => array:3 [
    "title" => "samba"
    "sum" => "10"
    "user" => "Janek"
  ]
  1 => array:3 [
    "title" => "Ramba"
    "sum" => "03:30:00"
    "user" => "Pawel"
  ]

]

I need sum all diff keys but for users. e.g user=>janek sum diff=>10 user=>Pawel sum diff=>3:30

I tried

$values=array_sum(array_column($newArray,'diff))

but this sum all array. I hope that you understand.

Pablos
  • 25
  • 3

2 Answers2

0

I got an answer for you. Well here is the code its messy but i think you can manage rest on your own... Any editing suggestions also welcome here...

<?php
$sumArray = array();
$myArray = array(
  0 => array(
    "title" => "samba",
    "diff" => "06:30:00",
    "user" => "Janek"
  ),
  1 => array(
    "title" => "Ramba",
    "diff" => "03:30:00",
    "user" => "Janek",
  ),
  2 => array(
    "title" => "fit",
    "diff" => "03:30:00",
    "user" => "Pawel"
  )
  );
$i = 0;
$xarray = array();
foreach ($myArray as $k=>$subArray) 
{   
    $parts = explode(':', $subArray["diff"]);
    $seconds = ($parts[0] * 60 * 60) + ($parts[1] * 60) + $parts[2];    
     if(in_array($subArray["user"],$xarray)):        
          $key = myfunction( $sumArray,"user",$subArray["user"]);
          $sumArray[$key]["sum"] = gmdate("H:i:s", $sumArray[$key]["sum1"]+$seconds);
     else:       
         $sumArray[$i] = $subArray;
         $sumArray[$i]["sum1"] =  $seconds;
         $sumArray[$i]["sum"] = gmdate("H:i:s",$seconds);
         $xarray[] = $subArray["user"];
         $i++;
     endif;     
}
foreach($sumArray as $key=>$value)
{
    unset($sumArray[$key]["diff"]);
    unset($sumArray[$key]["sum1"]);
}
function myfunction($arrays, $field, $value)
{
   foreach($arrays as $key => $product)
   {
      if ( $product[$field] === $value )
         return $key;
   }
}
echo "<pre>";
print_r($sumArray);
echo "</pre>";

Outputs :-

Array
(
    [0] => Array
        (
            [title] => samba
            [user] => Janek
            [sum] => 10:00:00
        )

    [1] => Array
        (
            [title] => fit
            [user] => Pawel
            [sum] => 03:30:00
        )

)
Praveen Kumar
  • 2,408
  • 1
  • 12
  • 20
0

To sum up hours for the grouped users use the following approach with DateTime::add(), preg_replace and array_values functions:

// supposing $arr is your initial array
$result = [];
foreach ($arr as $el) {
    if (!isset($result[$el['user']])) {
        $result[$el['user']] = $el;
    } else {
        $interval = new \DateInterval(preg_replace("/^(\d{2}):(\d{2}):\d{2}$/", 'PT$1H$2M', $el['diff']));
        $result[$el['user']]["diff"] = (new \DateTime($result[$el['user']]["diff"]))->add($interval)->format('H:i:s');
    }
}
foreach ($result as &$v) {  // renaming keys 'diff'/'sum'
    $v["sum"] = $v["diff"];
    unset($v["diff"]);
}
print_r(array_values($result));

The output:

Array
(
    [0] => Array
        (
            [title] => samba
            [user] => Janek
            [sum] => 10:00:00
        )

    [1] => Array
        (
            [title] => fit
            [user] => Pawel
            [sum] => 03:30:00
        )
)
RomanPerekhrest
  • 88,541
  • 4
  • 65
  • 105