1 回答

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊
這里你得到了算法:
對(duì)于每組時(shí)間預(yù)訂,執(zhí)行以下操作
找到最小的
start_time
將和
duration
之間添加到start_time
end_time
sum
查找下一個(gè)最小的時(shí)間預(yù)訂
start_time
IF
current_end_time
<previous_end_time
跳轉(zhuǎn)到 4 END IFIF
start_time
<previous_end_time
減去sum
END IF的差值在和
duration
之間添加start_time
end_time
跳到4,直到?jīng)]有匹配的元素為止。
快樂(lè)編碼:)
編輯 - 添加更干凈的實(shí)現(xiàn)
function getSortedDays(array $days): array {
return array_map(function (array $day) {
array_multisort(array_column($day, 'start_time'), SORT_ASC, $day);
return $day;
}, $days);
}
function addTotalAttendedHours(array $days): array {
$sortedDays = getSortedDays($days);
$days = array_map(function (array $day) {
$sum = (new DateTime())->setTimestamp(0);
$previousEnd = null;
foreach ($day as $time) {
$currentStart = new DateTimeImmutable($time['start_time']);
$currentEnd = new DateTimeImmutable($time['end_time']);
if ($currentEnd < $previousEnd) continue; // this has been added
$sum->add($currentStart->diff($currentEnd));
if ($previousEnd !== null && $currentStart < $previousEnd) {
$sum->sub($currentStart->diff($previousEnd));
}
$previousEnd = $currentEnd;
}
$attendedSeconds = $sum->getTimestamp();
$day['total_attended_hours'] = sprintf(
'%02u:%02u:%02u',
$attendedSeconds / 60 / 60,
($attendedSeconds / 60) % 60,
$attendedSeconds % 60
);
return $day;
}, $sortedDays);
return $days;
}
工作示例。
- 1 回答
- 0 關(guān)注
- 129 瀏覽
添加回答
舉報(bào)