Как сгруппировать массив дат по заданному интервалу?

Доброй ночи.
Подскажите, в какую сторону смотреть :) Есть массив дат, их нужно сгруппировать по заданному интервалу (по сменам) с 15:00 первого дня до 15:00 второго дня.

Вот исходные данные:
Array
(
    [0] => 08.12.2014 07:19:27
    [1] => 08.12.2014 07:51:49
    [2] => 08.12.2014 09:43:45
    [3] => 08.12.2014 10:18:52
    [4] => 08.12.2014 11:14:12
    [5] => 08.12.2014 12:01:24
    [6] => 08.12.2014 12:30:09
    [7] => 09.12.2014 18:31:59
    [8] => 09.12.2014 20:29:13
    [9] => 09.12.2014 21:37:42
    [10] => 09.12.2014 22:08:58
    [11] => 09.12.2014 22:46:20
    [12] => 09.12.2014 23:20:22
    [13] => 09.12.2014 23:37:20
    [14] => 10.12.2014 00:04:14
    [15] => 10.12.2014 01:22:13
    [16] => 10.12.2014 02:30:16
    [17] => 10.12.2014 06:30:40
    [18] => 10.12.2014 07:54:43
    [19] => 10.12.2014 08:43:03
    [20] => 10.12.2014 09:53:54
    [21] => 10.12.2014 10:15:49
    [22] => 10.12.2014 11:17:59
    [23] => 10.12.2014 12:35:01
    [24] => 13.12.2014 17:37:46
    [25] => 13.12.2014 18:07:49
    [26] => 13.12.2014 19:22:28
    [27] => 13.12.2014 19:44:46
    [28] => 13.12.2014 20:39:15
    [29] => 13.12.2014 21:31:40
    [30] => 13.12.2014 22:03:00
    [31] => 13.12.2014 23:06:12
    [32] => 13.12.2014 23:46:17
    [33] => 14.12.2014 00:38:47
    [34] => 14.12.2014 01:11:12
    [35] => 14.12.2014 01:46:53
    [36] => 14.12.2014 02:17:10
    [37] => 14.12.2014 03:17:12
    [38] => 14.12.2014 03:44:56
    [39] => 14.12.2014 04:36:19
    [40] => 14.12.2014 05:41:39
    [41] => 14.12.2014 08:20:47
    [42] => 14.12.2014 09:56:53
    [43] => 14.12.2014 11:13:14
    [44] => 14.12.2014 13:30:05
)


В данном случае, в первую смену должны попасть даты с 07.12.2014 15:00:00 до 08.12.2014 15:00:00, во вторую с 08.12.2014 15:00:00 до 09.12.2014 15:00:00, и т.д. В последнюю смену должны попасть 14.12.2014 15:00:00 до 15.12.2014 15:00:00
  • Вопрос задан
  • 2480 просмотров
Решения вопроса 1
socengel
@socengel
7 лет native php в продакшене, онлайн 20000+,
Твой массив это $dates Работать будет только при правильной сортировке.

$ndates = array();
foreach ( $dates as $key => $date )
{
	$ndates[$key] = strtotime($date) - (15*60*60);
}

$filtered_dates = array();
foreach ( $ndates as $key => $timestamp )
{
	$day = (int) date('d', $timestamp);
	$filtered_dates[$day][] = $key;
}

$grouped = array();
$group = 0;
foreach ($filtered_dates as $groups) {
	foreach ($groups as $id){
		$grouped[$group][] = $dates[$id];
	}
	$group++;
}

var_dump($grouped);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Перевести все в timestamp для начала.
Потом пройтись и раскидать все по дням ну и потом по часам уже.

Проверка даты odd/even проще всего наверно + если меньше 15 часов в первую смену, если больше во вторую - в итоге получится то что должно, возможно :)
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
$rgOutput = array();
foreach ($rgInput as $sDate) {
    $rDate = \datetime::createFromFormat('d.m.Y H:i:s', $sDate);
    assert('is_object($rDate)');
    if ($rDate->format('G') < 15) {
        $rDate->modify('-1 day');
    }
    $rgOutput[ $rDate->format('Y-m-d') ][] = $sDate;
}

?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы