如何从MySQL记录中合并时间范围数组并使用array_diff()?
解决PHP结合MySQL使用array_diff()处理所有事件时间范围的问题
我明白你的问题啦——你当前的代码只读取了数据库里的第一条事件记录,所以只能计算单个时间范围的空闲时段。要实现所有事件占用时间合并后再计算空闲小时的需求,咱们可以按以下步骤调整代码:
核心思路
- 初始化一个空数组来存储所有被占用的小时数
- 循环遍历数据库中所有的
events记录,把每条记录的start到end的时间范围都加入到占用小时数组中 - 对占用小时数组去重(避免重叠时段重复计算)
- 最后用
array_diff()对比可用小时数组和占用小时数组,得到空闲时段
完整代码示例
mysqli_select_db($conection, $database); $query_rsEvents = "SELECT * FROM events ORDER BY start ASC"; $rsEvents = mysqli_query($conection, $query_rsEvents) or die(mysqli_error()); // 初始化存储所有占用小时的数组 $busyHours = []; // 可用小时范围(9点到23点) $availableHours = range(9, 23); // 循环遍历所有事件记录 while ($row_rsEvents = mysqli_fetch_assoc($rsEvents)) { // 生成当前事件的时间范围数组(包含start到end的所有小时) $eventHours = range($row_rsEvents["start"], $row_rsEvents["end"]); // 将当前事件的小时数合并到占用数组中 $busyHours = array_merge($busyHours, $eventHours); } // 去重:移除重复的占用小时(比如多个事件重叠的时段) $busyHours = array_unique($busyHours); // 计算空闲小时:可用小时减去已占用小时 $freeHours = array_diff($availableHours, $busyHours); // 输出空闲小时 foreach ($freeHours as $hour) { echo $hour . "<br>"; } // 记得释放结果集 mysqli_free_result($rsEvents);
关键细节说明
- 使用
while循环替代单次mysqli_fetch_assoc(),这样能遍历数据库中所有的事件记录 array_merge()用来把每个事件的时间范围数组合并到总占用数组中array_unique()处理重叠时段,避免同一个小时被多次计入占用数组- 最后调用
array_diff()就能得到所有未被占用的空闲小时啦
内容的提问来源于stack exchange,提问作者D. Pavlovic
相关产品推荐
相关产品推荐

