将时间范围拆分为其他时间范围

Mic*_*yen 5 php arrays time datetime

我有一项复杂的任务,我现在已经在墙上撞了几天.我尝试过4种不同的方法,但每种方法似乎都停滞不前,而且变得非常令人沮丧.

我有时间范围.例如,14:30:00到18:30:00.考虑这个时间范围某人的工作转变.在此时间范围内,他们表示他们无法在15:30:00至16:30:00和17:30:00至18:30:00之间工作.我需要修改原始班次的开始和结束时间以消除冲突的班次.

原始移位数组如下所示:

$original_shift[0]['start'] = '14:30:00';
$original_shift[0]['end']   = '18:30:00';
Run Code Online (Sandbox Code Playgroud)

从原始班次中移除的时间范围如下所示:

$subshift[0]['start'] = '15:30:00';
$subshift[0]['end']   = '16:30:00';
$subshift[1]['start'] = '17:30:00';
$subshift[1]['end']   = '18:30:00';
Run Code Online (Sandbox Code Playgroud)

这是一个可视化:

在此输入图像描述

所以,当我完成时,我基本上需要我的原始轮班看起来像这样:

$original_shift[0]['start'] = '14:30:00';
$original_shift[0]['end']   = '15:30:00';
$original_shift[1]['start'] = '16:30:00';
$original_shift[1]['end']   = '17:30:00';
Run Code Online (Sandbox Code Playgroud)

我还需要考虑的一些并发症是:

  1. 这些时间范围可以是任何时间(不限于我在我的示例中使用的半小时),但是我将100%确定地知道不可用的时间范围将始终在原始班次的开始和之间开始和结束.结束时间.

  2. 不可用的时间可能会缩短和/或占用整个原始班次的时间.

我不是在寻找某人"编写我的代码",因为我正在寻找过去处理过类似事情的人,并且可能对他们如何完成它有一些了解.

Joe*_*Joe 3

由于您特别要求“一些见解”而不是完整的工作答案,因此我个人会选择填充“分钟”的数组。

$shift = array(
    'start' => '15:30:00',
    'end' => '18:30:00',

    'original' => array(),
    'unavailable' => array(),
    'modified' => array()
);
Run Code Online (Sandbox Code Playgroud)

然后,您需要进行一些调整,将其转换15:30:00为 930 和18:30:001110(分钟数),这将为您提供开始时间和结束时间之间的差异。

用于range()快速填充数组,以类似的格式original加载,然后使用诸如和 之类的东西来计算出原始班次中哪些分钟不可用。unavailablearray_intersect()array_diff()

由此,构建数组modified,并直接从那里读取到输出。