PHPackages                             gpslab/interval - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. gpslab/interval

ActiveLibrary[Database &amp; ORM](/categories/database)

gpslab/interval
===============

DDD interval structures

v0.2.4(4y ago)652.4k↓10.6%3[1 issues](https://github.com/gpslab/interval/issues)MITPHPPHP &gt;=5.6.0CI failing

Since Dec 15Pushed 4y ago1 watchersCompare

[ Source](https://github.com/gpslab/interval)[ Packagist](https://packagist.org/packages/gpslab/interval)[ Docs](https://github.com/gpslab/interval)[ RSS](/packages/gpslab-interval/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (4)Dependencies (3)Versions (8)Used By (0)

[![GitHub Actions](https://github.com/gpslab/interval/workflows/CI/badge.svg)](https://github.com/gpslab/interval/actions?query=workflow%3A%22CI%22+branch%3Amaster)[![Latest Stable Version](https://camo.githubusercontent.com/463a11f9406f529720546b7bf8fa421382ee420f577f00158c5fe9324c281b12/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6770736c61622f696e74657276616c2e7376673f6d61784167653d33363030266c6162656c3d737461626c65)](https://packagist.org/packages/gpslab/interval)[![Code Coverage](https://camo.githubusercontent.com/f91bc8654a670d86f0e81f0c34e02b0570b9c8fa93c2e3fa51cbccf4ccbfadf1/68747470733a2f2f636f6465636f762e696f2f67682f6770736c61622f696e74657276616c2f6272616e63682f6d61737465722f67726170682f62616467652e737667)](https://codecov.io/gh/gpslab/interval/branch/master)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/45cead6484f3379ca7b4cb2e8c00d1c837667a22438d57ef5b3604046b4a0bac/68747470733a2f2f696d672e736869656c64732e696f2f7363727574696e697a65722f672f6770736c61622f696e74657276616c2e7376673f6d61784167653d33363030)](https://scrutinizer-ci.com/g/gpslab/interval/?branch=master)[![StyleCI](https://camo.githubusercontent.com/27b0c6e21a56e3fa3416b4d2cc7306d83baf52c05f68cf838b6bab79301013e5/68747470733a2f2f7374796c6563692e696f2f7265706f732f37353037383833312f736869656c643f6272616e63683d6d6173746572)](https://styleci.io/repos/75078831)[![License](https://camo.githubusercontent.com/e995ea4092938c100e515a2a51f7926610f318ade4c5d0991ef25f600f86eeec/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f6770736c61622f696e74657276616c2e7376673f6d61784167653d33363030)](https://github.com/gpslab/interval)

Interval Value Objects
======================

[](#interval-value-objects)

This is a library with a set of classes intended to describe intervals as [Value Objects](https://en.wikipedia.org/wiki/Value_object) and perform operations on them.

Installation
------------

[](#installation)

Pretty simple with [Composer](http://packagist.org), run:

```
composer require gpslab/interval
```

Interval type
-------------

[](#interval-type)

This library is supports [interval types](https://en.wikipedia.org/wiki/Interval_(mathematics)).

- `[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

Intervals
---------

[](#intervals)

- Number
- Date
- Time
- DateTime
- Week
- Month
- Year
- IPv4
- IPv6
- IPv4Network
- IPv6Network

Usage intervals
---------------

[](#usage-intervals)

Create interval `[1, 5)`

```
$interval = NumberInterval::halfClosed(1, 5);
echo $interval->start(); // 1
echo $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); // true
```

Change intervals

```
$interval = NumberInterval::halfClosed(1, 5);
// created a new interval instance
$new_interval = $interval->withStart(new NumberIntervalPoint(2));
$interval->start() != $new_interval->start(); // true
```

IPv4 network

```
// from CIDR
$network = IPv4Network::fromCIDR('192.168.0.0', 16);
echo $network->start(); // 192.168.0.0
echo $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); // true
```

Local network

```
function isLocalNetworkHost($host)
{
    // is IPv6
    if (strpos($host, ':') !== false) {
        // RFC 4193
        return IPv6Network::fromString('fc00::/7')->contains($host);
    }

    // RFC 1918
    return
        IPv4Network::fromString('10/8')->contains($host) ||
        IPv4Network::fromString('172.16/12')->contains($host) ||
        IPv4Network::fromString('192.168/16')->contains($host)
    ;
}
```

Interval operations
-------------------

[](#interval-operations)

- `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.

Iterate intervals
-----------------

[](#iterate-intervals)

The following intervals support iteration:

- Number
- Date
- Time
- DateTime
- Week
- Month
- Year
- IPv4
- IPv4Network

### Example usage

[](#example-usage)

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]; // true
```

Use 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]; // true
```

Iterate 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; // true
```

Iterate 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; // true
```

Persistence in Doctrine
-----------------------

[](#persistence-in-doctrine)

You cat use intervals as [Custom Mapping Types](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/custom-mapping-types.html)for Doctrine.

```
Type::addType('NumberInterval', 'GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\NumberIntervalType');
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('NumberInterval', 'NumberInterval');
```

You cat [registration](http://symfony.com/doc/current/doctrine/dbal.html#registering-custom-mapping-types) custom Doctrine mapping types in Symfony

```
# config/packages/doctrine.yml
doctrine:
    dbal:
        types:
            NumberInterval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\NumberIntervalType
            DateInterval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\DateIntervalType
            TimeInterval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\TimeIntervalType
            DateTimeInterval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\DateTimeIntervalType
            WeekInterval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\WeekIntervalType
            MonthInterval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\MonthIntervalType
            YearInterval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\YearIntervalType
            IPv4Interval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\IPv4IntervalType
            IPv6Interval: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\IPv6IntervalType
            IPv4Network: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\IPv4NetworkType
            IPv6Network: GpsLab\Component\Interval\Persistence\Doctrine\DBAL\Types\IPv6NetworkType
```

License
-------

[](#license)

This bundle is under the [MIT license](http://opensource.org/licenses/MIT). See the complete license in the file: LICENSE

###  Health Score

33

—

LowBetter than 75% of packages

Maintenance17

Infrequent updates — may be unmaintained

Popularity36

Limited adoption so far

Community12

Small or concentrated contributor base

Maturity53

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 92.7% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~319 days

Recently: every ~274 days

Total

7

Last Release

1524d ago

Major Versions

v0.2.4 → 1.x-dev2022-03-16

PHP version history (2 changes)v0.1.0PHP &gt;=5.6.0

1.x-devPHP ^7.3 || ^8.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/9a6415c83577efe7b70d9ae4a3bb12958adc11c16e530ff844ff217b0fd0c54a?d=identicon)[Peter Gribanov](/maintainers/Peter%20Gribanov)

---

Top Contributors

[![peter-gribanov](https://avatars.githubusercontent.com/u/1954436?v=4)](https://github.com/peter-gribanov "peter-gribanov (139 commits)")[![simPod](https://avatars.githubusercontent.com/u/327717?v=4)](https://github.com/simPod "simPod (10 commits)")[![peter279k](https://avatars.githubusercontent.com/u/9021747?v=4)](https://github.com/peter279k "peter279k (1 commits)")

---

Tags

datetimeddddoctrineintervalipipv4ipv4-networkipv6ipv6-networkperiodphpvalue-object

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/gpslab-interval/health.svg)

```
[![Health](https://phpackages.com/badges/gpslab-interval/health.svg)](https://phpackages.com/packages/gpslab-interval)
```

###  Alternatives

[doctrine/orm

Object-Relational-Mapper for PHP

10.2k285.3M6.2k](/packages/doctrine-orm)[jdorn/sql-formatter

a PHP SQL highlighting library

3.9k115.1M102](/packages/jdorn-sql-formatter)[illuminate/database

The Illuminate Database package.

2.8k52.4M9.4k](/packages/illuminate-database)[ramsey/uuid-doctrine

Use ramsey/uuid as a Doctrine field type.

90440.3M211](/packages/ramsey-uuid-doctrine)[reliese/laravel

Reliese Components for Laravel Framework code generation.

1.7k3.4M16](/packages/reliese-laravel)[wildside/userstamps

Laravel Userstamps provides an Eloquent trait which automatically maintains `created\_by` and `updated\_by` columns on your model, populated by the currently authenticated user in your application.

7511.7M13](/packages/wildside-userstamps)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
