start = $_start->getTimestamp(); $this->end = $_end->getTimestamp(); } public function addAvailability(DateTime $_start, DateTime $_end) { $this->available[] = new TimeSlot($_start, $_end); // sort by start usort($this->available, function ($item1, $item2) { return $item1->start <=> $item2->start; }); // compact (join adjacent overlapping slots) // $this->vdump($this->available); $this->normalize(); $this->vdump($this->available); } public function removeAvailability(DateTime $_start, DateTime $_end) { $this->removeStart = $_start->getTimestamp(); $this->removeEnd = $_end->getTimestamp(); $this->cleanRemove(); $removeStart = null; $removeSnd = null; // sort by start usort($this->available, function ($item1, $item2) { return $item1->start <=> $item2->start; }); $this->normalize(); $this->vdump($this->available); } private function cleanRemove() { $allDone = true; for ($i=0; $iavailable); $i++) { // removeStart at or after slot start // removeEnd at or before slot end // split slot into 2 if($this->removeStart >= $this->available[$i]->start && $this->removeEnd <= $this->available[$i]->end) { $newSlot = new TimeSlot(new DateTime(), new DateTime()); $newSlot->start = $this->removeEnd; $newSlot->end = $this->available[$i]->end; $this->available[$i]->end = $this->removeStart; array_splice($this->available, $i+1, 0, [$newSlot]); $allDone = true; break; } // removeStart at or after slot start // removeStart at or before slot end // update slot to end at removeStart if($this->removeStart >= $this->available[$i]->start && $this->removeStart <= $this->available[$i]->end) { $this->available[$i]->end = $this->removeStart; $allDone = false; break; } // process removeEnd // removeEnd at or after slot start // removeEnd at or before slot end // update slot to start at removeEnd if($this->removeEnd >= $this->available[$i]->start && $this->removeEnd <= $this->available[$i]->end) { $this->available[$i]->start = $this->removeEnd; $allDone = false; break; } } if(!$allDone) { $this->normalize(); // recurse till clean } } private function normalize() { $allDone = true; for ($i=0; $iavailable)-1; $i++) { if($this->available[$i]->end >= $this->available[$i+1]->start && // ends in the middle of next slot $this->available[$i]->end <= $this->available[$i+1]->end) { // extend self & delete next $this->available[$i]->end = $this->available[$i+1]->end; array_splice($this->available, $i+1, 1); $allDone = false; break; } if($this->available[$i]->end >= $this->available[$i+1]->end) // ends after next slot end { // delete next array_splice($this->available, $i+1, 1); $allDone = false; break; } if($this->available[$i]->start >= $this->available[$i]->end) // starts and ends at the same time! { // delete self array_splice($this->available, $i, 1); $allDone = false; break; } } if(!$allDone) { $this->normalize(); // recurse till clean } } public function vdump($_x) { // echo "
";
//        print_r($_x);
//        echo "

"; } }