基于时间间隔分组DateTime对象,开发演出连续日期分组程序
按时间间隔分组DateTime数组&提取表演者到访演出集合
嘿,我来帮你搞定这两个任务,先把需求理清楚,再给你实打实的实现思路和代码示例:
需求拆解
咱们要完成两个核心目标:
- 将给定的
DateTime对象集合,按它们之间的时间间隔整理成二维数组分组 - 从演出数据中提取指定表演者的全部场次,把连续日期举办的演出归为一组,这类组就定义为「到访(visits)」
先给你看看你提到的DateTime对象子集示例:
Array ( [0] => DateTime Object ( [date] => 2017-04-22 12:45:49.000000 [timezone_type] => 3 [timezone] => America/Denver ) [1] => DateTime Object ( [date] => 2017-04-21 12:45:49.000000 [timezone_type] => 3 [timezone] => America/Denver ) // 更多DateTime对象... )
具体实现(PHP版本)
1. 按时间间隔分组DateTime数组
这里默认以**1天(24小时)**为间隔阈值,你可以随时调整。核心逻辑是先排序,再逐个对比时间差:
function groupDateTimeByInterval(array $dateTimes, int $intervalHours = 24): array { // 先把所有DateTime按时间从小到大排序 usort($dateTimes, function($a, $b) { return $a->getTimestamp() - $b->getTimestamp(); }); $groups = []; $currentGroup = [$dateTimes[0]]; // 初始化第一个分组 for ($i = 1; $i < count($dateTimes); $i++) { $lastInGroup = end($currentGroup); $timeDiff = $dateTimes[$i]->diff($lastInGroup); // 将天数和小时转换为总小时数 $totalHours = ($timeDiff->days * 24) + $timeDiff->h; // 间隔符合阈值则加入当前组,否则新建分组 if ($totalHours <= $intervalHours) { $currentGroup[] = $dateTimes[$i]; } else { $groups[] = $currentGroup; $currentGroup = [$dateTimes[$i]]; } } // 把最后一个分组加入结果 $groups[] = $currentGroup; return $groups; }
2. 提取指定表演者的到访演出集合
假设你的演出数据结构包含performer(表演者名称)和date(演出日期DateTime)字段,实现代码如下:
function getPerformerVisits(array $performances, string $targetPerformer): array { // 筛选出指定表演者的所有演出 $performerShows = array_filter($performances, function($show) use ($targetPerformer) { return $show['performer'] === $targetPerformer; }); // 按演出日期排序 usort($performerShows, function($a, $b) { return $a['date']->getTimestamp() - $b['date']->getTimestamp(); }); $visits = []; $currentVisit = [$performerShows[0]]; for ($i = 1; $i < count($performerShows); $i++) { $prevShowDate = end($currentVisit)['date']; $currentShowDate = $performerShows[$i]['date']; // 只比较日期部分,忽略具体时分秒 $dayDiff = $currentShowDate->diff($prevShowDate)->days; // 间隔1天以内(含同一天)的演出归为同一次到访 if ($dayDiff <= 1) { $currentVisit[] = $performerShows[$i]; } else { $visits[] = $currentVisit; $currentVisit = [$performerShows[$i]]; } } $visits[] = $currentVisit; return $visits; }
小提示
- 时间间隔分组中,你可以修改
$intervalHours参数调整分组标准,比如设为48就是按2天间隔分组 - 如果到访分组需要严格按24小时(而非自然日)判断,可将日期差计算改为用时间戳统计总小时数
内容的提问来源于stack exchange,提问作者WA Martin
相关产品推荐
相关产品推荐

