从特殊时间中删除时间,并在php中显示为slot



嘿,我必须通过php/lavel 创建预订系统

我从下面的列表中获取工作时间

08:00 to 13:00
16:00 to 21:00

我想从时间中删除特殊时间,并将其作为时段显示给用户例如,我想从时间中删除CCD_ 1和CCD_。

所以我想把这个时间显示给用户

08:00 to 09:30
11:00 to 13:00
16:00 to 17:00
18:00 to 21:00
$maintimes = [
[
'start' => '08:00',
'end' => '13:00'
],
[
'start' => '16:00',
'end' => '21:00'
],
];
// times to remove from $startTime and $endTime
$removes => [
[
'start' => '09:30',
'end' => '11:00'
],
[
'start' => '17:00',
'end' => '18:00'
]
];

// output must be like this
$output = [
[
'start' => '08:00',
'end' => '09:30'
],
[
'start' => '11:00',
'end' => '13:00'
],
[
'start' => '16:00',
'end' => '17:00'
],
[
'start' => '18:00',
'end' => '21:00'
],
];

/* 
logic:
Suppose. Working time starts from 08:00 to 13:00. Then from 13:00 to 16:00 it is rest time. And then again from the site 16:00 to 21:00 working time.
Therefore, some people take turns during the periods when it is time to work
*/

我研究了这个问题,但我找不到任何解决方案来修复这个

  • 根据end以升序对removes数组进行排序请注意,没有2个子数组可以具有相同的end值,因为这对拆分没有意义

  • 创建要处理的有效范围,包括有效的开始时间和结束时间。

  • 前一个的结束时间是新的开始时间,依此类推,以尊重所提供的差距。

  • 对于分割,如果只有13:0016:00在该范围内,则对它们进行分割,否则按原样使用该范围。如果任何范围的开始时间高于16:00,则只包含一次新范围16:00-start_time以适应间隙。

代码段:

<?php
function getMinutes($t){
$t = explode(":", $t);
return intval($t[0]) * 60 + intval($t[1]);
}
function getSplits($removes, $startTime, $endTime, $breakStart, $breakEnd){
if($startTime === $endTime) return [];

usort($removes, function($r1, $r2){
return getMinutes($r1['end']) <=> getMinutes($r2['end']);
});

$ranges = [];
foreach($removes as $r){
$ranges[] = [$startTime, $r['start']];
$startTime = $r['end'];
}
$ranges[] = [$startTime, $endTime]; // include the last range as well

$breakStartMinutes = getMinutes($breakStart);
$breakEndMinutes = getMinutes($breakEnd);

$splits = [];

foreach($ranges as $rr){
$break_split = false;

$startMinutes = getMinutes($rr[0]);
$endMinutes   = getMinutes($rr[1]);

if($breakStartMinutes > $startMinutes && $breakStartMinutes < $endMinutes){
$break_split = true;
$splits[] = [$rr[0], $breakStart];
}

if($breakEndMinutes > $startMinutes && $breakEndMinutes < $endMinutes){
$break_split = true;
$breakEndMinutes = 1441; // since we need to consume this only once
$splits[] = [$breakEnd, $rr[1]];
}else if($breakEndMinutes < $startMinutes){
$splits[] = [$breakEnd, $rr[0]];
$breakEndMinutes = 1441; // since we need to consume this only once
}

if($break_split === false){
$splits[] = $rr;
}
}

return $splits;
}
print_r(getSplits($removes, '08:00', '21:00', '13:00', '16:00'));

在线演示

最新更新