2016-08-01 3 views
0

У меня есть массив, который содержит дни и входы/выходы работодателей в течение дня. Обычно это всего 4 строки в день. (In -> Out (lunch) -> In -> Out)Рассчитать общее количество отработанных часов

Я хотел бы, чтобы все часы работали в соответствии с вводом/выводом и показывали их работодателю.

Так что мой массив дней структурирован таким образом:

Day '2016-07-01' -> Events (4) -> (0) => ('in', '09:00') 
            (1) => ('out', '13:00') 
            (2) => ('in', '14:00') 
            (3) => ('out', '17:00') 

и так далее ..

К примеру выше приведенный ниже код печатает 6.90, который является неправильным, правильный результат должен быть 8 ч.

$total_minutes = 0; 
$total_hours = 0; 

foreach($listOfDays as $day) 
{ 
    foreach($day->events as $key => $event) 
    { 
     // It's always 'in' 
     if(($key % 2 == 0) || $key == 0) 
     { 
     $hour_in = new DateTime($event->hour); 
     $hour_out = null; 

     if(isset($day->events[$key + 1]->hour)) 
      $hour_out = new DateTime($day->events[$key + 1]->hour); 

     if($hour_out != null) 
     { 
      $total_hours += $hour_out->diff($hour_in)->format('%H'); 
      $total_minutes += $hour_out->diff($hour_in)->format('%i'); 
     } 
     } 
     // It's always 'out' 
     else 
     { 
     $hour_in = new DateTime($day->events[$key - 1]->hour); 
     $hour_out = new DateTime($event->hour); 

     $total_hours += $hour_out->diff($hour_in)->format('%H'); 
     $total_minutes += $hour_out->diff($hour_in)->format('%i'); 
     } 
    } 
} 

$total_hours_worked = $total_hours . '.' . $total_minutes; 
print_r($total_hours_worked); 

ответ

0

решаемые.

Поскольку key % 2 всегда out движение, мне не нужно условие для in движения, потому что out уже подтверждает.

if($key % 2 != 0) 
{ 
    $hour_in = null; 
    $hour_out = $event->hour; 

    if(isset($day->events[$key - 1]->hour)) 
     $hour_in = $day->events[$key - 1]->hour; 

    if($hour_in != null) 
     $diff += (strtotime($hour_out) - strtotime($hour_in)); 
} 

В конце цикла:

$total    = $diff/60; 
$total_hours  = floor($total/60); 
$total_minutes  = floor($total % 60); 
$total_hours_worked = sprintf('%02dh%02d', $total_hours, $total_minutes); 

На основе PHP Calculate total time

Смежные вопросы