PHPackages                             makedo/php-paginator - 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. [Utility &amp; Helpers](/categories/utility)
4. /
5. makedo/php-paginator

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

makedo/php-paginator
====================

Data source independent paginator for php

1.0.2(6y ago)012MITPHPPHP &gt;=7.1

Since Sep 3Pushed 6y ago1 watchersCompare

[ Source](https://github.com/makedo/php-paginator)[ Packagist](https://packagist.org/packages/makedo/php-paginator)[ RSS](/packages/makedo-php-paginator/feed)WikiDiscussions master Synced 2mo ago

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

Paginator
=========

[](#paginator)

This is yet another paginator for php. Main idea of this package is to build data source independent paginator, which has an ability to work in several modes:

- Count skip by id

    ```
        $loader = function (int $limit, int $skip): iterable
        {
            //SELECT * from users  WHERE id > $skip LIMIT $limit
        };

        $perPage = 100;
        $lastIdOnPreviousPage = 34;

        $paginatorFactory = new SkipById($perPage);

        $page = $paginatorFactory
            ->createPaginator(new CallableLoader($loader), $lastIdOnPreviousPage)
            ->paginate()
        ;
    ```

    In this example you have an ability use `id` as skip value. As you can see, Loader function accepts `id` in `$skip` variable. It should be `id` of last item on previous page and it comes from client side. For 1st page it should be 0. For `$page->hasNext` paginator will load `$perPage + 1` item, and then check if actual count of loaded items is more than `$perPage`.

    Optionally, you can set `$currentPage` value, which will be set to `$page->currentPage`.
- Count skip by id with total count

    ```
       $loader = function (int $limit, int $skip): iterable {
           //SELECT * from users  WHERE id > $skip LIMIT
       };

       $counter = function (): int {
           //SELECT count(id) from users
       };

       $perPage = 100;
       $lastIdOnPreviousPage = 35;

       $paginatorFactory = new SkipByIdCountable($perPage);
       $page = $paginatorFactory
           ->createPaginator(
               new CallableLoader($loader),
               new CallableCounter($counter),
               $lastIdOnPreviousPage
           )
           ->paginate()
       ;
    ```

    In above example paginator counts skip by id and uses total count for `$page->total`, `$page->totalPages` values. For `$page->hasNext` paginator will load `$perPage + 1` item, and then check if actual count of loaded items is more than `$perPage`.
- Count skip by id with total count and current page

    ```
       $loader = function (int $limit, int $skip): iterable {
           //SELECT * from users  WHERE id > $skip LIMIT
       };

       $counter = function (): int {
           //SELECT count(id) from users
       };

       $perPage = 100;
       $lastIdOnPreviousPage = 35;
       $currentPage = 4;

       $paginatorFactory = new SkipByIdCountable($perPage);
       $page = $paginatorFactory
           ->createPaginator(
               new CallableLoader($loader),
               new CallableCounter($counter),
               $lastIdOnPreviousPage,
               $currentPage
           )
           ->paginate()
       ;
    ```

    In above example paginator counts skip by id and uses total count for `$page->total`, `$page->totalPages`, `$page->hasNext` values. In this case, we know `$currentPage` value, which in real case comes from client, so we can use total count and `$currentPage` for counting `$page->hasNext` except using `$perPage + 1` strategy.
- Count skip by offset

    ```
    $loader = function (int $limit, int $skip): iterable
    {
        //SELECT * from users LIMIT $limit OFFSET $skip
    };

    $perPage = 100;
    $currentPage = 2;

    $paginatorFactory = new SkipByOffset($perPage);

    $page = $paginatorFactory
        ->createPaginator(new CallableLoader($loader), $currentPage)
        ->paginate()
    ;
    ```

    In above example paginator counts skip as offset according to $perPage and $currentPage values. For counting `$page->hasNext` paginator will load `$perPage + 1` item, and then check if actual count of loaded items is more than `$perPage`.

    - Count skip by offset and use total count

        ```
           $loader = function (int $limit, int $skip): iterable {
               //SELECT * from users LIMIT $limit OFFSET $skip
           };

           $counter = function (): int {
               //SELECT count(id) from users
           };

           $perPage = 100;
           $currentPage = 2;

           $paginatorFactory = new SkipByOffsetCountable($perPage);

           $page = $paginatorFactory
               ->createPaginator(new CallableLoader($loader), new CallableCounter($counter), $currentPage)
               ->paginate()
           ;
        ```

        In above example paginator counts skip by offset and uses total count for `$page->total`, `$page->totalPages`, `$page->hasNext` values.

###  Health Score

24

—

LowBetter than 32% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity5

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity55

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% 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 ~1 days

Total

3

Last Release

2444d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/e2714584eec1b2ae416a03df9b9323cb07a14de2580aa8e49b505d45856590bc?d=identicon)[makedo](/maintainers/makedo)

---

Top Contributors

[![makedo](https://avatars.githubusercontent.com/u/3338923?v=4)](https://github.com/makedo "makedo (40 commits)")

### Embed Badge

![Health badge](/badges/makedo-php-paginator/health.svg)

```
[![Health](https://phpackages.com/badges/makedo-php-paginator/health.svg)](https://phpackages.com/packages/makedo-php-paginator)
```

###  Alternatives

[magarrent/laravel-url-shortener

Simpler Url Shortener for Laravel

557.4k](/packages/magarrent-laravel-url-shortener)

PHPackages © 2026

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