This PHP library provides some tools to handle intervals. For instance, you can compute the union or intersection of two intervals.
This library provides some tools to handle intervals. For instance, you can compute the union or intersection of two intervals.
composer require kirouane/interval
Let's assume an interval [20, 40]. We instantiate a new Interval object .
$interval = new Interval(20, 40);// [20, 40];
or
$interval = Interval::create('[20,40]');// [20, 40];
We can do some operations like :
echo $interval->intersect(new Interval(30, 60)); // [30, 40];
echo $interval->union(new Interval(30, 60)); // {[20, 60]};
or
echo $interval->union(new Interval(60, 100)); // {[20, 40], [60, 100]};
echo $interval->exclude(new Interval(30, 60)); // {[20, 30[};
or
echo $interval->exclude(new Interval(30, 35)); // {[20, 30[, ]35, 40]};
We can compare two intervals as well:
echo $interval->overlaps(new Interval(30, 60)); // true;
echo $interval->includes(new Interval(30, 60)); // false;
$interval = new Interval(new \DateTime('2016-01-01'), new \DateTime('2016-01-10'));
// [2016-01-01T00:00:00+01:00, 2016-01-10T00:00:00+01:00];
echo $interval->union(Interval::create('[2016-01-10, 2016-01-15]'));
// {[2016-01-01T00:00:00+01:00, 2016-01-15T00:00:00+01:00]};
$interval = new Interval(-INF, INF);// ]-∞, +∞[;
echo $interval->exclude(Interval::create('[2016-01-10, 2016-01-15]'));
// {]-∞, 2016-01-10T00:00:00+01:00[, ]2016-01-15T00:00:00+01:00, +∞[};
$intervals = Intervals::create(['[0,5]', '[8,12]']);// {[0, 5], [8, 12]};
echo $intervals->exclude(Intervals::create(['[3,10]'])); // {[0, 3[, ]10, 12]};
$result = Interval
::create('[10, 20]')
->intersect(new Interval(11, 30))
->union(new Interval(15, INF))
->exclude(Intervals::create(['[18, 20]', '[25, 30]', '[32, 35]', '[12, 13]']))
->sort(function (Interval $first, Interval $second) {
return $first->getStart()->getValue() <=> $second->getStart()->getValue();
})
->map(function (Interval $interval) {
return new Interval(
$interval->getStart()->getValue() ** 2,
$interval->getEnd()->getValue() ** 2
);
})
->filter(function (Interval $interval) {
return $interval->getEnd()->getValue() > 170;
});
// {[169, 324], [400, 625], [900, 1024], [1225, +∞[};
echo $result;
You can create intervals with open boundaries :
$result = Intervals
::create([']10, +INF['])
->exclude(Intervals::create([']18, 20]', ']25, 30[', '[32, 35]', ']12, 13]']));
// {]10, 12], ]13, 18], ]20, 25], [30, 32[, ]35, +∞[}
You are very welcomed to contribute to this Library!
Clone
git clone https://github.com/Kirouane/interval.git
Install
composer install
or
make install
(with docker and docker-compose)
Test
vendor/bin/phpunit
Build
vendor/bin/grumphp run