This is a library with a set of classes intended to describe intervals as Value Objects and perform operations on them.
Pretty simple with Composer, run:
composer require gpslab/intervalThis library is supports interval types.
[a, b] = [a, b] = {x ∈ ℝ | a ≤ x ≤ b}- Closed[a, b) = [a, b[ = {x ∈ ℝ | a ≤ x < b}- Half-closed(a, b] = ]a, b] = {x ∈ ℝ | a < x ≤ b}- Half-open(a, b) = ]a, b[ = {x ∈ ℝ | a < x < b}- Open
- Number
- Date
- Time
- DateTime
- Week
- Month
- Year
- IPv4
- IPv6
- IPv4Network
- IPv6Network
Create interval [1, 5)
$interval = NumberInterval::halfClosed(1, 5);
echo$interval->start(); // 1echo$interval->end(); // 5// convert to string$string = (string)$interval;
echo$string; // [1, 5)// restore from string$new_interval = NumberInterval::fromString($string);
$interval == $new_interval; // true$interval->equal($new_interval); // trueChange intervals
$interval = NumberInterval::halfClosed(1, 5);
// created a new interval instance$new_interval = $interval->withStart(newNumberIntervalPoint(2));
$interval->start() != $new_interval->start(); // trueIPv4 network
// from CIDR$network = IPv4Network::fromCIDR('192.168.0.0', 16);
echo$network->start(); // 192.168.0.0echo$network->end(); // 192.168.255.255$network->contains('192.168.13.74'); // true// from ip mask$new_network = IPv4Network::fromMask('192.168.0.0', '255.255.0.0');
$network->equal($new_network); // trueLocal network
functionisLocalNetworkHost($host)
{
// is IPv6if (strpos($host, ':') !== false) {
// RFC 4193return IPv6Network::fromString('fc00::/7')->contains($host);
}
// RFC 1918return
IPv4Network::fromString('10/8')->contains($host) ||
IPv4Network::fromString('172.16/12')->contains($host) ||
IPv4Network::fromString('192.168/16')->contains($host)
;
}equal- Checks if this Interval is equal to the specified interval;contains- Does this interval contain the specified point;intersects- Does this interval intersect the specified interval;intersection- Gets the intersection between this interval and another interval;cover- Gets the covered interval between this Interval and another interval;gap- Gets the gap between this interval and another interval;abuts- Does this interval abut with the interval specified;join- Joins the interval between the adjacent;union- Gets the union between this interval and another interval;before- The point is before the interval;after- The point is after the interval.
The following intervals support iteration:
- Number
- Date
- Time
- DateTime
- Week
- Month
- Year
- IPv4
- IPv4Network
Use step 1 and closed interval type [1, 5]
$interval = NumberInterval::closed(1, 5);
$points_in_interval = [];
foreach ($interval->iterate() as$point) {
$points_in_interval[] = $point;
}
$points_in_interval == [1, 2, 3, 4, 5]; // trueUse step 2 and open interval type (0, 10)
$step = 2;
$interval = NumberInterval::open(0, 10);
$points_in_interval = [];
foreach ($interval->iterate($step) as$point) {
$points_in_interval[] = $point;
}
$points_in_interval == [2, 4, 6, 8]; // trueIterate IPv4 interval
$expected = [
'10.0.1.2',
'10.0.1.4',
'10.0.1.6',
'10.0.1.8'
];
$step = 2;
$interval = IPv4Interval::open('10.0.1.0', '10.0.1.10');
$points_in_interval = [];
foreach ($interval->iterate($step) as$point) {
$points_in_interval[] = $point;
}
$points_in_interval == $expected; // trueIterate date interval
$expected = [
'2017-03-03',
'2017-03-05',
'2017-03-07',
'2017-03-09',
];
$step = new \DateInterval('P2D');
$interval = DateInterval::open(new \DateTime('2017-03-01'), new \DateTime('2017-03-11'));
$points_in_interval = [];
foreach ($interval->iterate($step) as$point) {
$points_in_interval[] = $point->format('Y-m-d');
}
$points_in_interval == $expected; // trueYou cat use intervals as Custom Mapping Types for Doctrine.
Type::addType('NumberInterval', 'GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\NumberIntervalType');
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('NumberInterval', 'NumberInterval');You cat registration custom Doctrine mapping types in Symfony
# config/packages/doctrine.ymldoctrine:
dbal:
types:
NumberInterval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\NumberIntervalTypeDateInterval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\DateIntervalTypeTimeInterval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\TimeIntervalTypeDateTimeInterval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\DateTimeIntervalTypeWeekInterval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\WeekIntervalTypeMonthInterval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\MonthIntervalTypeYearInterval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\YearIntervalTypeIPv4Interval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\IPv4IntervalTypeIPv6Interval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\IPv6IntervalTypeIPv4Network: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\IPv4NetworkTypeIPv6Network: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\IPv6NetworkTypeThis bundle is under the MIT license. See the complete license in the file: LICENSE