Advertisement
Guest User

Crashes PHP 7.1.5 when run

a guest
May 23rd, 2017
482
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.19 KB | None | 0 0
  1. <?php
  2. class Foo {
  3.     private $start;
  4.     private $end;
  5.     public function __construct(\DateTimeImmutable $start, \DateTimeImmutable $end)
  6.     {
  7.         $this->start = $start;
  8.         $this->end = $end;
  9.     }
  10.     public function getPeriod()
  11.     {
  12.         return new \DatePeriod($this->start, $this->start->diff($this->end), $this->end);
  13.     }
  14. }
  15.  
  16. class Bar
  17. {
  18.     private $foos = [];
  19.  
  20.     public function __construct(array $foos)
  21.     {
  22.         $this->foos = $foos;
  23.     }
  24.  
  25.     public function getFoos()
  26.     {
  27.         return $this->foos;
  28.     }
  29.  
  30.     public function doSomething()
  31.     {
  32.         $removePeriods = [];
  33.         $removePeriods[1234] = [];
  34.         foreach ([
  35.                      '2017-06-14 00:00:00' => '2017-06-15 00:00:00',
  36.                      '2017-06-23 00:00:00' => '2017-06-24 00:00:00',
  37.                      '2017-07-04 00:00:00' => '2017-07-05 00:00:00',
  38.                      '2017-07-05 00:00:00' => '2017-07-06 00:00:00',
  39.                      '2017-07-06 00:00:00' => '2017-07-07 00:00:00',
  40.                      '2017-07-25 00:00:00' => '2017-07-26 00:00:00',
  41.                      '2017-07-26 00:00:00' => '2017-07-27 00:00:00',
  42.                      '2017-07-27 00:00:00' => '2017-07-28 00:00:00',
  43.                      '2017-06-12 00:00:00' => '2017-06-13 00:00:00',
  44.                      '2017-06-13 00:00:00' => '2017-06-14 00:00:00',
  45.                      '2017-06-15 00:00:00' => '2017-06-16 00:00:00',
  46.                      '2017-06-16 00:00:00' => '2017-06-17 00:00:00',
  47.                      '2017-06-18 00:00:00' => '2017-06-19 00:00:00',
  48.                      '2017-06-17 00:00:00' => '2017-06-18 00:00:00',
  49.                      '2017-06-24 00:00:00' => '2017-06-25 00:00:00',
  50.                      '2017-06-25 00:00:00' => '2017-06-26 00:00:00',
  51.                      '2017-06-22 00:00:00' => '2017-06-23 00:00:00',
  52.                      '2017-06-21 00:00:00' => '2017-06-22 00:00:00',
  53.                      '2017-06-20 00:00:00' => '2017-06-21 00:00:00',
  54.                      '2017-06-19 00:00:00' => '2017-06-20 00:00:00',
  55.                  ] as $start => $end) {
  56.             $removePeriodStart = new \DateTimeImmutable($start, new \DateTimeZone('Europe/Berlin'));
  57.             $removePeriodEnd = new \DateTimeImmutable($end, new \DateTimeZone('Europe/Berlin'));
  58.             $removePeriods[1234][] = new \DatePeriod(
  59.                 $removePeriodStart,
  60.                 $removePeriodStart->diff($removePeriodEnd),
  61.                 $removePeriodEnd
  62.             );
  63.         }
  64.  
  65.         foreach ($this->getFoos() as $foo) {
  66.             $periods = [$foo->getPeriod()];
  67.  
  68.             foreach ($removePeriods[1234] as $removePeriod) {
  69.                 $periods = $this->removePeriodFromPeriods($removePeriod, $periods);
  70.             }
  71.         }
  72.     }
  73.  
  74.     private function removePeriodFromPeriods(\DatePeriod $periodToRemove, array $periods)
  75.     {
  76.         /** @var \DatePeriod[] $periods */
  77.         $periods = array_values($periods);
  78.  
  79.         $newPeriods = [];
  80.         $newIndex = count($newPeriods);
  81.         foreach ($periods as $index => $period) {
  82.             $newPeriods[$index] = clone $period;
  83.  
  84.             // Check if the period to remove is outside of the current period (no overlapping)
  85.             if ($periodToRemove->getEndDate() <= $period->getStartDate() ||
  86.                 $periodToRemove->getStartDate() >= $period->getEndDate()
  87.             ) {
  88.                 continue;
  89.             }
  90.  
  91.             // Check if the current period is completely overlapped by the period to remove
  92.             $removeStartLowerEqualStart = ($periodToRemove->getStartDate() <= $period->getStartDate());
  93.             $removeEndGreaterEqualEnd = ($periodToRemove->getEndDate() >= $period->getEndDate());
  94.             if ($removeStartLowerEqualStart && $removeEndGreaterEqualEnd) {
  95.                 // Unset period
  96.                 unset($newPeriods[$index]);
  97.                 continue;
  98.             }
  99.  
  100.             // Check if the beginning of the current period is overlapped by the period to remove
  101.             $removeEndLowerEnd = ($periodToRemove->getEndDate() < $period->getEndDate());
  102.             if ($removeStartLowerEqualStart && $removeEndLowerEnd) {
  103.                 // Update period
  104.                 $newPeriods[$index] = new \DatePeriod(
  105.                     $periodToRemove->getEndDate(),
  106.                     $periodToRemove->getEndDate()->diff($period->getEndDate()),
  107.                     $period->getEndDate()
  108.                 );
  109.                 continue;
  110.             }
  111.  
  112.             // Check if the end of the current period is overlapped by the period to remove
  113.             $removeStartGreaterStart = ($periodToRemove->getStartDate() > $period->getStartDate());
  114.             if ($removeStartGreaterStart && $removeEndGreaterEqualEnd) {
  115.                 // Update period
  116.                 $newPeriods[$index] = new \DatePeriod(
  117.                     $period->getStartDate(),
  118.                     $period->getStartDate()->diff($periodToRemove->getStartDate()),
  119.                     $periodToRemove->getStartDate()
  120.                 );
  121.                 continue;
  122.             }
  123.  
  124.             // Check if the period to remove in contained by the current period
  125.             if ($removeStartGreaterStart && $removeEndLowerEnd) {
  126.                 // Update period (to the first part)
  127.                 $newPeriods[$index] = new \DatePeriod(
  128.                     $period->getStartDate(),
  129.                     $period->getStartDate()->diff($periodToRemove->getStartDate()),
  130.                     $periodToRemove->getStartDate()
  131.                 );
  132.                 // Create new period (for the second part)
  133.                 $newPeriods[$newIndex++] = new \DatePeriod(
  134.                     $periodToRemove->getEndDate(),
  135.                     $periodToRemove->getEndDate()->diff($period->getEndDate()),
  136.                     $period->getEndDate()
  137.                 );
  138.                 continue;
  139.             }
  140.         }
  141.  
  142.         return $newPeriods;
  143.     }
  144. }
  145.  
  146. $foo = new Foo(
  147.     new \DateTimeImmutable('2017-05-22 09:00:00', new \DateTimeZone('Europe/Berlin')),
  148.     new \DateTimeImmutable('2017-08-24 18:00:00', new \DateTimeZone('Europe/Berlin'))
  149. );
  150. $search = new Bar([$foo]);
  151. $search->doSomething();
  152.  
  153. echo 'success';
  154.  
  155. exit;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement