【问题标题】:Create continuous time line from multiple time periods从多个时间段创建连续的时间线
【发布时间】:2019-02-11 14:34:27
【问题描述】:

嘿,stackoverflow 社区,

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

$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'
));

而我正在寻找的结果是这样的:

$array = 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'
));

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

【问题讨论】:

  • “尽管我很努力,但我找不到合适的解决方案”你更接近的解决方案是什么?
  • 很好地把@Dave
  • 非常抱歉。我犹豫是否要发布一些代码,因为我的是一个完全不起作用的火车残骸。但现在我知道这是正确的方法,我肯定会在以后的帖子中考虑这一点。非常感谢!

标签: php arrays time


【解决方案1】:

只需将所有时间转换为 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 索引可能不是最优雅的方式,但如果需要,您可以了解概念并改进您的代码。

【讨论】:

  • 我建议一般使用 Unix 时间戳,并且只有在向用户显示时才将其转换为文本。这让生活更轻松。对于数据库,如果需要进行任何计算,我更喜欢 bigint 而不是 datetime。
【解决方案2】:

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

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

【讨论】:

  • 一段示例(工作)代码肯定会让这成为一个更好的答案
  • @RiggsFolly 实际上,我认为对没有尝试代码的问题给出一般方法的答案是非常合适的。这实际上是一个算法问题,而不是 PHP 问题。
猜你喜欢
  • 2020-08-19
  • 2020-06-03
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 2012-04-24
相关资源
最近更新 更多