假设某人需要预订房间。客房预订服务的开放时间为08:00:00至18:00:00。因此,预订时间有限:
array:2 [▼
0 => "08:00:00"
1 => "18:00:00"
]
房间可能已经预定了一些时间,应该是这样的:
array:3 [▼
0 => array:2 [▼
0 => "08:05:00"
1 => "09:00:00"
]
1 => array:2 [▼
0 => "10:00:00"
1 => "15:00:00"
]
2 => array:2 [▼
0 => "16:00:00"
1 => "17:00:00"
]
]
我想做的是找到时间间隔,结果应该是这样的:
array:4 [▼
0 => array:2 [▼
0 => "8:00:00"
1 => "8:05:00"
]
1 => array:2 [▼
0 => "9:00:00"
1 => "10:00:00"
]
2 => array:2 [▼
0 => "15:00:00"
1 => "16:00:00"
]
3 => array:2 [▼
0 => "17:00:00"
1 => "18:00:00"
]
]
似乎我必须先对预订的时间数组进行排序,然后对数组进行补充。但是如何在PHP代码中实现它。有人可以帮我解决这个问题吗?提前THX。
答案 0 :(得分:1)
如果未按开始时间对预订进行排序,则需要对它们进行排序。然后,您可以遍历预订,在一个预订结束与下一个预订开始之间创建空闲时间条目。请注意,由于您的时间是HH:mm:ss
格式,因此您可以将它们直接比较为字符串;无需将它们转换为整数时间值。
$hours = ["08:00:00", "18:00:00"];
$bookings = [["10:00:00", "15:00:00"],
["08:05:00", "09:00:00"],
["16:00:00", "17:00:00"]
];
$start = $hours[0];
$end = $hours[1];
// sort the bookings
$bstart = array_column($bookings, 0);
array_multisort($bstart, $bookings);
// get the free times
$time = $start;
$bindex = 0;
$free = array();
while ($time < $end && $bindex < count($bookings)) {
if ($time < $bookings[$bindex][0]) {
$free[] = [$time, $bookings[$bindex][0]];
}
$time = $bookings[$bindex][1];
$bindex++;
}
// end of day free?
if ($time < $end) {
$free[] = [$time, $end];
}
print_r($free);
输出:
Array
(
[0] => Array
(
[0] => 08:00:00
[1] => 08:05:00
)
[1] => Array
(
[0] => 09:00:00
[1] => 10:00:00
)
[2] => Array
(
[0] => 15:00:00
[1] => 16:00:00
)
[3] => Array
(
[0] => 17:00:00
[1] => 18:00:00
)
)