这是给我的:
$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"
}