Создать непрерывную линию времени из нескольких периодов времени - PullRequest
0 голосов
/ 11 февраля 2019

Привет, сообщество 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?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Просто конвертируйте все время в метки времени 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 не самый элегантный способ, но вы можете получить концепцию и улучшить свой код, если это необходимо.

0 голосов
/ 11 февраля 2019

Я думаю, что наивное решение for-in-for должно работать.

  • Вы берете наименьшую (минимальную) дату в массивах и помещаете в новый массив
  • , затем идетечтобы найти следующую мину в oldArray, которая больше, чем последний элемент в newArray
  • вычесть из него день и вставить его в newArray
  • поставить дату, которую вы нашли на шаге 2в качестве следующего элемента
  • повторите с шага 2, пока не будет найден новый min (или пока oldArray не станет пустым, если вы решите удалить элементы в oldArray)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...