首页 > 解决方案 > 如何从 foreach 总结小时/分钟

问题描述

我如何总结时间以返回小时/分钟。我需要将 IN 与 OUT 相加。因为人们可以多次来并开始。

表数据

|     Day    |   Hour   | Status |
|------------|----------|--------|
| 03/04/2021 | 19:45:05 | in     |
| 03/04/2021 | 20:03:50 | out    |
| 03/04/2021 | 20:04:34 | in     |
| 03/04/2021 | 20:04:51 | out    |
| 03/04/2021 | 21:04:59 | in     |
| 03/04/2021 | 23:59:59 | out    |
| 03/04/2021 | 22:08:07 | in     |
| 03/04/2021 | 22:08:55 | out    |
| 03/05/2021 | 14:46:32 | in     |
| 03/05/2021 | 19:25:09 | out    |

代码

foreach ($timesheets as $timesheet) {
    $total -= strtotime($timesheet['hour']);
}
    
// Absolute value of time difference in seconds
$diff  = abs($total);
    
// Convert $diff to minutes
$tmins = $diff / 60;
    
// Get hours
$hours = floor($tmins / 60);
    
// Get minutes
$mins = $tmins%60;

return "<b>$hours</b> hours and<b>$mins</b> minutes</b>";

数据数组

Array ( 
    [0] => Array ( [0] => 2021-03-05 [1] => 19:25:09 [2] => out )
    [1] => Array ( [0] => 2021-03-05 [1] => 14:46:32 [2] => in )
    [2] => Array ( [0] => 2021-03-04 [1] => 22:08:55 [2] => out ) 
    [3] => Array ( [0] => 2021-03-04 [1] => 22:08:07 [2] => in ) 
    [4] => Array ( [0] => 2021-03-04 [1] => 23:59:59 [2] => out ) 
    [5] => Array ( [0] => 2021-03-04 [1] => 21:04:59 [2] => in ) 
    [6] => Array ( [0] => 2021-03-04 [1] => 20:04:51 [2] => out )
    [7] => Array ( [0] => 2021-03-04 [1] => 20:04:34 [2] => in )
    [8] => Array ( [0] => 2021-03-04 [1] => 20:03:50 [2] => out ) 
    [9] => Array ( [0] => 2021-03-04 [1] => 19:42:05 [2] => in )
)

标签: phpdatetimemariadb

解决方案


您的数据看起来顺序相反。您可以按升序查询数据,也可以使用array_reverse().

$timesheets = array_reverse($timesheets);

然后,您可以与一起分组in和计时。outarray_chunk()

$chunks = array_chunk($timesheets, 2);

然后你可以计算 和 之间的in时间outarray_map()

$diffs = array_map(function ($chunk) {
    return strtotime($chunk[1][1]) - strtotime($chunk[0][1]);
}, $chunks);

并将时间差与 相加array_sum()

$sum = array_sum($diffs);

然后打印出时间。

$seconds = $sum % 60;
$minutes = ($sum / 60) % 60;
$hours = (int) ($sum / 3600);

echo "$hours hours $minutes minutes $seconds seconds";

推荐阅读