为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用多维数组以及重叠检查来获取从开始时间到结束时间的总小时数?

如何使用多维数组以及重叠检查来获取从开始时间到结束时间的总小时数?

PHP
湖上湖 2023-08-19 16:16:26
我有一个以下场景,我需要仅检查特定日期数组内的重叠并获取总出勤时间。array (  '2020-07-14' =>   array (    'total_attended_hours' => 0,    0 =>     array (      'start_time' => '09:00:00',      'end_time' => '13:00:00',      'hours' => '4 hours 0 mins',    ),    1 =>     array (      'start_time' => '13:30:00',      'end_time' => '16:30:00',      'hours' => '3 hours 0 mins',    ),    2 =>     array (      'start_time' => '09:00:00',      'end_time' => '14:00:00',      'hours' => '5 hours 0 mins',    ),  ),  '2020-07-15' =>   array (    'total_attended_hours' => 0,    0 =>     array (      'start_time' => '13:30:00',      'end_time' => '17:00:00',      'hours' => '3 hours 30 mins',    ),    1 =>     array (      'start_time' => '09:00:00',      'end_time' => '14:00:00',      'hours' => '5 hours 0 mins',    ),  ),)如上面的日期示例所示,2020-07-14我们的start_time and end_time:- 总出席时间为should be equals to7 小时 30 分钟``接下来2020-07-15应该是total_attended_hours=8 hours 0 mins操场以下数组的新问题$data = [  '2020-07-14' =>   [    [      'start_time' => '14:15:00',      'end_time' => '17:45:00',    ],[      'start_time' => '14:30:00',      'end_time' => '17:30:00',    ],[      'start_time' => '14:30:00',      'end_time' => '17:30:00',    ],  ],  '2020-07-15' => [    [      'start_time' => '13:30:00',      'end_time' => '17:00:00',    ],[      'start_time' => '09:00:00',      'end_time' => '14:00:00',    ],  ],];结果 :-Array(    [2020-07-14] => Array        (            [0] => Array                (                    [start_time] => 14:15:00                    [end_time] => 17:45:00                )            [1] => Array                (                    [start_time] => 14:30:00                    [end_time] => 17:30:00                )            [2] => Array                (                    [start_time] => 14:30:00                    [end_time] => 17:30:00                )            [total_attended_hours] => 03:15:00        )[total_attended_hours] => 03:15:00应该在哪里[total_attended_hours] => 03:30:00
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

这里你得到了算法:

  1. 对于每组时间预订,执行以下操作

  2. 找到最小的start_time

  3. 将和duration之间添加到start_timeend_timesum

  4. 查找下一个最小的时间预订start_time

  5. IF current_end_time<previous_end_time跳转到 4 END IF

  6. IF start_time<previous_end_time减去sumEND IF的差值

  7. 在和duration之间添加start_timeend_time

  8. 跳到4,直到没有匹配的元素为止。

快乐编码:)

编辑 - 添加更干净的实现

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;

}

工作示例



查看完整回答
反对 回复 2023-08-19
  • 1 回答
  • 0 关注
  • 66 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信