用一部分关闭时间计算打开时间



这是给我的: $openinghours = ['09:00-18:00'];

现在可以有多个"关闭时间",例如: $closed[] = '11:30-12:15'; $closed[] = '16:00-16:30';

我需要得到新的开放时间,比如: $openinghours = ['09:00-11:30,'12:15-16:00','16-30-18:00']; 所以它现在有了封闭时间的缺口

我从哪里开始?我不知道如何计算这个并得到预期的结果。

通过在连字符上分解所有时间范围,您可以手动拼凑打开/关闭时间。

对于您的项目数据,我的解决方案可能不够健壮,也可能不够健壮。我的解决方案不执行验证,不对关闭的跨度进行排序,也不检查跨度是否与打开/关闭时间匹配或超过打开/关闭的时间。我的代码片段在很大程度上依赖于可靠的数据。

代码:(演示(

$openinghours = ['09:00-18:00']; 
$closed[] = '11:30-12:15';
$closed[] = '16:00-16:30';
[$start, $end] = explode('-', $openinghours[0]);
foreach ($closed as $span) {
[$shut, $reopen] = explode('-', $span);
$result[] = $start . '-' . $shut;
$start = $reopen;
}
$result[] = $start . '-' . $end;
var_export($result);

输出:

array (
0 => '09:00-11:30',
1 => '12:15-16:00',
2 => '16:30-18:00',
)

如果您的php版本不支持数组析构函数,则可以使用explode()调用list()

这可能不是实现这一目标的最快方法,但您可以在这里看到它的工作原理。

$openingHours = ['09:00-18:00'];
$closedHours  = ['11:30-12:15', '16:00-16:30'];
$openStart  = explode("-", $openingHours[0])[0]; # 09:00
$openFinish = explode("-", $openingHours[0])[1]; # 18:00
$hours = [];
foreach($closedHours as $closed)
$hours[] = explode('-', $closed);
$dynamicHours = ["{$openStart}-"];
for($i = 0; $i <= count($hours) -1; $i++) {
$dynamicHours[$i] .= $hours[$i][0];
$dynamicHours[]    = "{$hours[$i][1]}-";
}
$dynamicHours[count($dynamicHours) -1] .= $openFinish;
var_dump($dynamicHours);

这会给你的输出

array(3) {
[0]=>
string(11) "09:00-11:30"
[1]=>
string(11) "12:15-16:00"
[2]=>
string(11) "16:30-18:00"
}

最新更新