如何在PHP数组中计算多组Intime与Outtime的总时长?
PHP计算多组入出时间总时长的实现方案
嗨,我来帮你搞定这个时间计算的需求!咱们一步步来拆解问题,最终实现总时长的计算:
第一步:拆分入站和出站时间数组
首先得把原数组里的入时间(-i结尾)和出时间(-o结尾)分开,这样才能一一对应计算每组的时长。我们可以用array_filter结合字符串匹配来筛选,之后重置索引确保两组数组的索引是对应的:
$originalArray = [ '07:50:15-i', '10:55:41-i', '12:33:30-i', '12:34:04-i', '14:32:57-i', '14:32:59-i', '10:29:27-o', '12:06:16-o', '14:29:10-o', '14:29:12-o', '15:02:28-o', '16:57:31-o' ]; // 筛选所有入时间并重置索引 $inTimes = array_values(array_filter($originalArray, function($item) { return strpos($item, '-i') !== false; })); // 筛选所有出时间并重置索引 $outTimes = array_values(array_filter($originalArray, function($item) { return strpos($item, '-o') !== false; }));
第二步:计算每组时长并累加总时长
接下来我们遍历每组对应的入出时间,先去掉后缀得到纯时间字符串,然后用DateTime类来处理时间差计算,最后把每组的时长(秒数)累加到总时长里:
$totalSeconds = 0; // 遍历每组时间(这里默认入、出时间的数量是一一对应的) foreach ($inTimes as $index => $inTimeStr) { // 移除时间字符串的后缀 $cleanIn = str_replace('-i', '', $inTimeStr); $cleanOut = str_replace('-o', '', $outTimes[$index]); // 转换为DateTime对象 $inDateTime = DateTime::createFromFormat('H:i:s', $cleanIn); $outDateTime = DateTime::createFromFormat('H:i:s', $cleanOut); // 计算时间差并转换为秒数 $interval = $outDateTime->diff($inDateTime); $groupSeconds = $interval->h * 3600 + $interval->i * 60 + $interval->s; // 累加到总时长 $totalSeconds += $groupSeconds; }
第三步:将总秒数转换为易读的时间格式
最后把总秒数转换成HH:MM:SS的格式,方便查看:
// 计算小时、分钟、秒 $hours = floor($totalSeconds / 3600); $remaining = $totalSeconds % 3600; $minutes = floor($remaining / 60); $seconds = $remaining % 60; // 格式化输出,确保两位数 $totalDuration = sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds); echo "总时长:{$totalDuration}";
注意事项
- 要确保入时间和出时间的数量是一一对应的,否则会出现索引不存在的错误;
- 这个方案适用于同一天内的时间计算,如果存在跨天的情况,需要在时间字符串中补充日期信息再进行计算。
内容的提问来源于stack exchange,提问作者KMKMAHESH
相关产品推荐
相关产品推荐

