Нахождение перекрывающихся диапазонов дат в массиве - PullRequest
4 голосов
/ 27 сентября 2011

У меня есть массив диапазонов дат, например:

[0] => Array
                (
                    [start_time] => 2011-10-01 00:00:00
                    [end_time] => 2011-10-05 00:00:00
                    [name] => Apples
                )

[1] => Array
                (
                    [start_time] => 2011-10-04 00:00:00
                    [end_time] => 2011-10-10 00:23:00
                    [name] => Oranges
                )

[2] => Array
                (
                    [start_time] => 2011-10-15 00:00:00
                    [end_time] => 2011-10-20 00:23:00
                    [name] => Bananas
                )

Я пытаюсь вычислить перекрытие между каждым событием и «разделить» это перекрытие на отдельный элемент в массиве, а затем настроитьstart_time и end_time пересекающихся событий соответственно, поэтому они больше не перекрываются.Например, в массиве выше «Яблоки» пересекаются с апельсинами на один день, поэтому я бы хотел получить массив, который выглядит следующим образом.

[0] => Array
                (
                    [start_time] => 2011-10-01 00:00:00
                    [end_time] => 2011-10-04 00:00:00
                    [name] => Apples
                )
[1] => Array
                (
                    [start_time] => 2011-10-04 00:00:00
                    [end_time] => 2011-10-05 00:00:00
                    [name] => Apples Oranges
                )

[2] => Array
                (
                    [start_time] => 2011-10-05 00:00:00
                    [end_time] => 2011-10-10 00:23:00
                    [name] => Oranges
                )

[3] => Array
                (
                    [start_time] => 2011-10-15 00:00:00
                    [end_time] => 2011-10-20 00:23:00
                    [name] => Bananas
                )

1 Ответ

0 голосов
/ 27 сентября 2011

Чтобы получить достаточно эффективный код, я думаю, вам придется упорядочить даты по времени начала.После этого должно быть довольно легко получить пересечения, пройдя через даты окончания.

Поскольку вы сказали, что вы новичок в PHP, вы можете прочитать о функции http://php.net/manual/en/function.strtotime.php Это преобразует ваши отформатированные даты в метки времени Unix, делая их сопоставимыми.

Для сортировки приведенной выше структуры данных обратите внимание на различные функции сортировки массивов: http://de3.php.net/manual/en/array.sorting.php

Особенно uasort может быть интересным для вас.

Как и другие говорили, SO здесь не для написания вашего кода, поэтому взгляните на теорию множеств, чтобы получить представление о еще более эффективных решениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...