/** * @return Event[] */ public function generateEvents() { $start = new DateTime($this->start); $end = new DateTime($this->end); $end = $end->add($start->diff($end)); switch ($this->repeat_type) { case self::TYPE_WEEKS: $interval = DateInterval::createFromDateString("1 week"); break; case self::TYPE_MONTHS: $interval = DateInterval::createFromDateString("1 month"); break; case self::TYPE_YEARS: $interval = DateInterval::createFromDateString("1 year"); break; default: $interval = DateInterval::createFromDateString("1 day"); break; } $_existing_events = Event::findAllForGroup($this->_pdo, $this); $_existing_events_keyed = []; foreach ($_existing_events as $_existing_event) { $key = Utility::getDateTimeForMySQLDate($_existing_event->getStart()); $_existing_events_keyed[$key] = $_existing_event; } $_events = []; while (count($_events) < $this->n_times) { if (array_key_exists(Utility::getDateTimeForMySQLDate($start), $_existing_events_keyed)) { continue; } $_event = new Event($this->_pdo); $_event->create($this->name, $this->notes, $this->all_day_event, $this->is_chapter, $this->getCreator(), $end, $start, $this->id); $_events[] = $_event; $start->add($interval); $end->add($interval); } return array_merge($_existing_events, $_events); }