php - 合并时间段 - php
问题描述
我有每个红色标记期间的信息(开始时间戳和完成时间戳)。
最后一个期间还应包含合并期间的数量,如蓝色跨度所示。
我已经尝试从最小值和最大值开始每分钟迭代一次,但我想这不是解决这个问题的最佳方法。我实际上已经没有想法了:(示例数据:
[0] => Array
(
[start] => 2018-11-8 09:00
[startTimestamp] => 1541664000
[finish] => 2018-11-8 15:00
[finishTimestamp] => 1541685600
[machine_id] => 1
)
[1] => Array
(
[start] => 2018-11-8 01:30
[startTimestamp] => 1541637000
[finish] => 2018-11-8 05:30
[finishTimestamp] => 1541651400
[machine_id] => 1
)
[2] => Array
(
[start] => 2018-11-8 10:00
[startTimestamp] => 1541667600
[finish] => 2018-11-8 18:30
[finishTimestamp] => 1541698200
[machine_id] => 4
)
[3] => Array
(
[start] => 2018-11-8 09:00
[startTimestamp] => 1541664000
[finish] => 2018-11-8 15:00
[finishTimestamp] => 1541685600
[machine_id] => 5
)
[4] => Array
(
[start] => 2018-11-8 01:30
[startTimestamp] => 1541637000
[finish] => 2018-11-8 05:30
[finishTimestamp] => 1541651400
[machine_id] => 5
)
感谢@solarc 回复
$startEndTimes = [];
foreach ($periodsData as $periodsDatum) {
$startEndTimes[$periodsDatum['startTimestamp']] = date('Y-m-d H:i:s', $periodsDatum['startTimestamp']);
$startEndTimes[$periodsDatum['finishTimestamp']] = date('Y-m-d H:i:s', $periodsDatum['finishTimestamp']);
}
$split = [];
foreach ($periodsData as $periodsDatum) {
foreach ($startEndTimes as $timestamp => $dateTime) {
if ($timestamp < $periodsDatum['finishTimestamp'] AND $timestamp > $periodsDatum['startTimestamp']) {
$split[] = [
'machine_id' => $periodsDatum['machine_id'],
'startTimestamp' => $periodsDatum['startTimestamp'],
'finishTimestamp' => $timestamp,
'start' => $periodsDatum['start'],
'finish' => date('Y-n-j H:i:s', $timestamp),
];
$split[] = [
'machine_id' => $periodsDatum['machine_id'],
'startTimestamp' => $timestamp,
'finishTimestamp' => $periodsDatum['finishTimestamp'],
'start' => date('Y-n-j H:i:s', $timestamp),
'finish' => $periodsDatum['finish'],
];
}
}
}
解决方案
制作一组所有开始和结束时间(不重复)
[01:30, 05:30, 09:00, 10:00, 14:00, 18:30]
如果集合的开始和结束时间之间存在时间,则拆分每个块(例如,从 09:00 到 15:00 的块被拆分为 2:09:00 到 10:00 和 10:00 到 15: 00):
- 01:30 to 05:30 (col 1) - 09:00 to 10:00 (col 1) - 10:00 to 15:00 (col 1) - 10:00 to 15:00 (col 2) - 15:00 to 18:30 (col 2) - 01:30 to 05:30 (col 3) - 09:00 to 10:00 (col 3) - 10:00 to 15:00 (col 3) - 10:00 to 15:00 (col 4) - 15:00 to 18:30 (col 4)
最后,计算在列中重复了多少块:
- 01:30 to 05:30 (2 times) - 09:00 to 10:00 (2 times) - 10:00 to 15:00 (4 times) - 15:00 to 18:30 (2 times)
推荐阅读
- dynamics-crm - 向实体添加字段以进行数据导入和 Power Query 分析,而无需触及 Dynamics 解决方案
- sharepoint - 使用 AppID 和 APPSecret 对 SmtpClient 进行身份验证,而不是传递用户名和密码
- angular - Angular HttpClient 不与 post 一起执行
- angular - Angular Material:如何格式化 datepicker 日期标签?
- flutter - 如何在 Dart 中使用多态性
- python - 以字符串形式python实现条件语句
- reactjs - 将状态参数传递给函数
- java - 向 ArrayList Java 添加不同大小的数组
- php - PHP foreach循环并将值添加到mysql表
- depth-first-search - 解决河内塔的最佳搜索算法?