Here is the solution I implemented for the problem. Is it effective, I can’t say. Is it the best way, not sure too.
foreach ($eventNodes as $eventNode) {
if ($eventNode->getProperty('isTimePeriod')) {
$dates = iterator_to_array($this->extractIntervalDates($eventNode->getProperty('startDate'), $eventNode->getProperty('endDate')));
$result = $this->duplicateEventForDates($eventNode, $dates, $result, self::CHECK_WEEKS);
} else {
$result[] = [
'event' => $eventNode,
'displayDate' => $eventNode->getProperty('startDate')
];
}
}
duplicateEventForDates method :
private function duplicateEventForDates(NodeInterface $eventNode, array $dates, array $result, bool $mustCheckWeeks = false): array
{
$datesCollection = DateCollection::collect($dates);
if ($mustCheckWeeks) {
$datesCollection->filter(fn($date) => ($date > new DateTimeImmutable('now')) && (in_array($date->format('w'), $this->getEventWeeks($eventNode))));
} else {
$datesCollection->filter(fn($date) => $date > new DateTimeImmutable('now'));
}
$datesCollection
->sort(fn(DateTimeImmutable $firstDate, DateTimeImmutable $secondDate) => $firstDate->getTimestamp() - $secondDate->getTimestamp())
->forEachDate(function ($date) use (&$result, $eventNode) {
array_push($result, [
'event' => $eventNode,
'displayDate' => $date
]);
});
return $result;
}