You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从MySQL记录中合并时间范围数组并使用array_diff()?

解决PHP结合MySQL使用array_diff()处理所有事件时间范围的问题

我明白你的问题啦——你当前的代码只读取了数据库里的第一条事件记录,所以只能计算单个时间范围的空闲时段。要实现所有事件占用时间合并后再计算空闲小时的需求,咱们可以按以下步骤调整代码:

核心思路

  1. 初始化一个空数组来存储所有被占用的小时数
  2. 循环遍历数据库中所有的events记录,把每条记录的start到end的时间范围都加入到占用小时数组中
  3. 对占用小时数组去重(避免重叠时段重复计算)
  4. 最后用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:31:21