从多个时间段创建连续的时间线

时间:2019-02-11 14:34:27

标签: php arrays time

嘿stackoverflow社区,

我目前正在尝试从一系列时间段中归档连续的时间轴。我的输入数组如下所示:

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.7.3282.0

我正在寻找的结果是:

$array = array(
0 => array(
    'from' => '2019-01-01 00:00:00',
    'to' => '2019-03-31 00:00:00'
),
1 => array(
    'from' => '2019-02-04 00:00:00',
    'to' => '2019-03-15 00:00:00'
));

尽我所能,我找不到合适的解决方案。 有谁知道如何用PHP解决这个问题?

2 个答案:

答案 0 :(得分:3)

只需将所有时间转换为Unix时间戳,将它们放入一个简单的数组中,进行排序,然后通过构造所需的数组将它们转换回日期时间:

<?php
$array = array(
    0 => array(
        'from' => '2019-01-01 00:00:00',
        'to' => '2019-03-31 00:00:00'
    ),
    1 => array(
        'from' => '2019-02-04 00:00:00',
        'to' => '2019-03-15 00:00:00'
    ));

$unixTS = array();
foreach ($array as $arr => $times) {
    foreach ($times as $str => $time) {
        $unixTS[] = strtotime($time);
    }
}

sort($unixTS);

$newArray = array();
for ($i = 0; $i < count($unixTS); $i++) {
    if ($i < count($unixTS) - 1) {
        if ($i + 2 >= count($unixTS))
            $newArray[] = array('from' => date("Y-m-d H:i:s", $unixTS[$i]), 'to' => date("Y-m-d H:i:s", $unixTS[$i + 1]));
        else
            $newArray[] = array('from' => date("Y-m-d H:i:s", $unixTS[$i]), 'to' => date("Y-m-d H:i:s", $unixTS[$i + 1] - 1));
    }
}

print_r($newArray);

输出:

Array
(
[0] => Array
    (
        [from] => 2019-01-01 00:00:00
        [to] => 2019-02-03 23:59:59
    )

[1] => Array
    (
        [from] => 2019-02-04 00:00:00
        [to] => 2019-03-14 23:59:59
    )

[2] => Array
    (
        [from] => 2019-03-15 00:00:00
        [to] => 2019-03-31 00:00:00
    )
)

使用$i索引可能不是最优雅的方法,但是您可以理解这个概念并在需要时改进代码。

答案 1 :(得分:1)

我认为天真的解决方案应该可行。

  • 您将数组中的最小(最小)日期作为日期,然后放入newArray
  • 然后继续查找oldArray中的下一个分钟,该分钟大于newArray中的最后一个元素
  • 从中减去一天并将其插入newArray
  • 将您在第2步中找到的日期作为下一个元素
  • 从步骤2开始重复,直到找不到新的分钟(或者,如果您选择删除oldArray中的元素,直到oldArray为空)