PHP从重叠事件数组中获取正常运行时间



解决方案:

我看了看:合并PHP数组中的重叠范围?

并在这个例子中解决了我的问题:https://3v4l.org/XCtlT

此处的非工作代码示例:https://3v4l.org/sStTT

本质上,我有一系列重叠的停机事件,看起来像这样:

$incidents = [
  ['start' => '2016-01-05 00:00:00', 'end' => '2016-01-10 23:59:59'],
  ['start' => '2016-01-07 00:00:00', 'end' => '2016-01-15 23:59:59'], // overlapping
  ['start' => '2016-01-12 00:00:00', 'end' => '2016-01-13 23:59:59'], // overlapping
  ['start' => '2016-01-20 00:00:00', 'end' => '2016-01-25 23:59:59'],
  ['start' => '2016-01-23 00:00:00', 'end' => '2016-01-24 23:59:59']  // overlapping
];

从偶发事件数组中,我希望得到以下结果作为正常运行时间数组。

Array
(
    [0] => Array
        (
            [start] => 2016-01-01 00:00:00
            [end] => 2016-01-05 00:00:00
        )
    [1] => Array
        (
            [start] => 2016-01-15 23:59:59
            [end] => 2016-01-20 00:00:00
        )
    [2] => Array
        (
            [start] => 2016-01-25 23:59:59
            [end] => 2016-01-31 23:59:59
        )
)

不幸的是,我的逻辑游戏不够好,无法足够可靠和高效地完成任务。在真实的例子中,我在一个DB中有大约250万行事件。

你对使用2 for循环来计算正常运行时间有什么想法?

有没有更有效/更简单的方法可以做到这一点?

您是否能够完成逻辑,从而使正常运行时间结果按预期工作?

这样的算法有四个步骤:

  1. 将事件筛选为与报告日期范围重叠的事件
  2. 按事件开始对事件进行排序
  3. 将所有事件合并到连续块中(O(n)操作(
  4. 通过返回合并事件之间的间隔来反转这些范围(O(n)操作(

步骤1和2可以在数据库查询中简单处理,例如:

select    start, end
from      incidents
where     start < :reportEnd and
          end   > :reportStart
order by  start

相关内容

  • 没有找到相关文章

最新更新