Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- class Foo {
- private $start;
- private $end;
- public function __construct(\DateTimeImmutable $start, \DateTimeImmutable $end)
- {
- $this->start = $start;
- $this->end = $end;
- }
- public function getPeriod()
- {
- return new \DatePeriod($this->start, $this->start->diff($this->end), $this->end);
- }
- }
- class Bar
- {
- private $foos = [];
- public function __construct(array $foos)
- {
- $this->foos = $foos;
- }
- public function getFoos()
- {
- return $this->foos;
- }
- public function doSomething()
- {
- $removePeriods = [];
- $removePeriods[1234] = [];
- foreach ([
- '2017-06-14 00:00:00' => '2017-06-15 00:00:00',
- '2017-06-23 00:00:00' => '2017-06-24 00:00:00',
- '2017-07-04 00:00:00' => '2017-07-05 00:00:00',
- '2017-07-05 00:00:00' => '2017-07-06 00:00:00',
- '2017-07-06 00:00:00' => '2017-07-07 00:00:00',
- '2017-07-25 00:00:00' => '2017-07-26 00:00:00',
- '2017-07-26 00:00:00' => '2017-07-27 00:00:00',
- '2017-07-27 00:00:00' => '2017-07-28 00:00:00',
- '2017-06-12 00:00:00' => '2017-06-13 00:00:00',
- '2017-06-13 00:00:00' => '2017-06-14 00:00:00',
- '2017-06-15 00:00:00' => '2017-06-16 00:00:00',
- '2017-06-16 00:00:00' => '2017-06-17 00:00:00',
- '2017-06-18 00:00:00' => '2017-06-19 00:00:00',
- '2017-06-17 00:00:00' => '2017-06-18 00:00:00',
- '2017-06-24 00:00:00' => '2017-06-25 00:00:00',
- '2017-06-25 00:00:00' => '2017-06-26 00:00:00',
- '2017-06-22 00:00:00' => '2017-06-23 00:00:00',
- '2017-06-21 00:00:00' => '2017-06-22 00:00:00',
- '2017-06-20 00:00:00' => '2017-06-21 00:00:00',
- '2017-06-19 00:00:00' => '2017-06-20 00:00:00',
- ] as $start => $end) {
- $removePeriodStart = new \DateTimeImmutable($start, new \DateTimeZone('Europe/Berlin'));
- $removePeriodEnd = new \DateTimeImmutable($end, new \DateTimeZone('Europe/Berlin'));
- $removePeriods[1234][] = new \DatePeriod(
- $removePeriodStart,
- $removePeriodStart->diff($removePeriodEnd),
- $removePeriodEnd
- );
- }
- foreach ($this->getFoos() as $foo) {
- $periods = [$foo->getPeriod()];
- foreach ($removePeriods[1234] as $removePeriod) {
- $periods = $this->removePeriodFromPeriods($removePeriod, $periods);
- }
- }
- }
- private function removePeriodFromPeriods(\DatePeriod $periodToRemove, array $periods)
- {
- /** @var \DatePeriod[] $periods */
- $periods = array_values($periods);
- $newPeriods = [];
- $newIndex = count($newPeriods);
- foreach ($periods as $index => $period) {
- $newPeriods[$index] = clone $period;
- // Check if the period to remove is outside of the current period (no overlapping)
- if ($periodToRemove->getEndDate() <= $period->getStartDate() ||
- $periodToRemove->getStartDate() >= $period->getEndDate()
- ) {
- continue;
- }
- // Check if the current period is completely overlapped by the period to remove
- $removeStartLowerEqualStart = ($periodToRemove->getStartDate() <= $period->getStartDate());
- $removeEndGreaterEqualEnd = ($periodToRemove->getEndDate() >= $period->getEndDate());
- if ($removeStartLowerEqualStart && $removeEndGreaterEqualEnd) {
- // Unset period
- unset($newPeriods[$index]);
- continue;
- }
- // Check if the beginning of the current period is overlapped by the period to remove
- $removeEndLowerEnd = ($periodToRemove->getEndDate() < $period->getEndDate());
- if ($removeStartLowerEqualStart && $removeEndLowerEnd) {
- // Update period
- $newPeriods[$index] = new \DatePeriod(
- $periodToRemove->getEndDate(),
- $periodToRemove->getEndDate()->diff($period->getEndDate()),
- $period->getEndDate()
- );
- continue;
- }
- // Check if the end of the current period is overlapped by the period to remove
- $removeStartGreaterStart = ($periodToRemove->getStartDate() > $period->getStartDate());
- if ($removeStartGreaterStart && $removeEndGreaterEqualEnd) {
- // Update period
- $newPeriods[$index] = new \DatePeriod(
- $period->getStartDate(),
- $period->getStartDate()->diff($periodToRemove->getStartDate()),
- $periodToRemove->getStartDate()
- );
- continue;
- }
- // Check if the period to remove in contained by the current period
- if ($removeStartGreaterStart && $removeEndLowerEnd) {
- // Update period (to the first part)
- $newPeriods[$index] = new \DatePeriod(
- $period->getStartDate(),
- $period->getStartDate()->diff($periodToRemove->getStartDate()),
- $periodToRemove->getStartDate()
- );
- // Create new period (for the second part)
- $newPeriods[$newIndex++] = new \DatePeriod(
- $periodToRemove->getEndDate(),
- $periodToRemove->getEndDate()->diff($period->getEndDate()),
- $period->getEndDate()
- );
- continue;
- }
- }
- return $newPeriods;
- }
- }
- $foo = new Foo(
- new \DateTimeImmutable('2017-05-22 09:00:00', new \DateTimeZone('Europe/Berlin')),
- new \DateTimeImmutable('2017-08-24 18:00:00', new \DateTimeZone('Europe/Berlin'))
- );
- $search = new Bar([$foo]);
- $search->doSomething();
- echo 'success';
- exit;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement