@kschingiz

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

Существует некий календарь в фронэнде, который выводит количество событий на какую то дату. Это может быть типо : на 15 февраля 5 событий, на 20 февраля 20 событий.
Данные получаем в таком виде:
[{
title: "Событие 1",
date_start:"2015-02-25";
date_end:"2015-02-25"
},
{
title: "Событие 2",
date_start:"2015-02-25";
date_end:"2015-02-28"
}]

Теперь прикол такой что надо сделать массив такого типа, ключом которого являются даты, а значения количество событий:
[{
2015-05-25: 2,
2015-05-26: 1,
2015-05-27: 1,
2015-05-28: 1,
}]

Тут проблема в том, как сфомировать такой массив и как учесть пересечения, например Событие 2 длится с 25 февраля по 28 февраля.
Понятно что надо пробегать по массиву и инкрементировать значения дней, но как сформировать такой массив выше?
  • Вопрос задан
  • 2677 просмотров
Решения вопроса 1
lexxpavlov
@lexxpavlov
Программист, преподаватель
Наверное, вам нужно учитывать событие на всём протяжении длительности события, то есть учитывать его не только в день начала, но и в каждый день, когда оно длится.
Тогда нужно для каждого события сделать цикл, и для каждого дня в интервале считать это событие:
$dates = array();
foreach ($events as $event) {
    $dateStart = \DateTime::createFromFormat('Y-m-d', $event['date_start']);
    $dateEnd = \DateTime::createFromFormat('Y-m-d', $event['date_end']);
    while ($dateStart <= $dateEnd) {
        $date = $dateStart->format('Y-m-d');
        if (!isset($dates[$date])) $dates[$date] = 0;
        $dates[$date]++;
        $dateStart->modify('+1 day');
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
судя по второму листингу, учитывается только дата начала события.
т.е. второе событие хоть и длится 3 дня, но показываться будет только для 1го.
в таком случае,
$calendar = array();
foreach ($events as $event) {
  $calendar[$event['date_start']] = isset($calendar[$event['date_start']]) ? 
    $calendar[$event['date_start']] + 1 : 
    1;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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