Home  >  Article  >  Backend Development  >  How to Limit Pagination Links in PHP with a Smart Pagination Algorithm?

How to Limit Pagination Links in PHP with a Smart Pagination Algorithm?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-17 16:10:03385browse

How to Limit Pagination Links in PHP with a Smart Pagination Algorithm?

Smart Pagination Algorithm

When implementing pagination, it's often desirable to limit the number of page links displayed to avoid overwhelming the user. This can be achieved by using a "smart" pagination algorithm that only shows a few adjacent pages to the current page.

Example Algorithm

The following PHP code demonstrates a smart pagination algorithm that truncates the page list to show only two adjacent pages to the current page:

<code class="php"><?php

// Define number of adjacent pages to show
$adjacents = 2;

// Define number of items per page
$limit = 5;

// Get current page number
$page = (int)$_GET["page"] ?? 1;

// Calculate first item to display on this page
$start = ($page - 1) * $limit;

// Get data
$data = $db
    ->query("SELECT * FROM mytable LIMIT $start, $limit")
    ->fetchAll();

// Calculate total number of pages
$total_pages = count($data);

// Setup page variables
$prev = $page - 1;
$next = $page + 1;
$lastpage = ceil($total_pages / $limit);
$lpm1 = $lastpage - 1;

// Generate pagination markup
$pagination = "<nav aria-label='page navigation'><ul class='pagination'>";

// Previous button
$pagination .= "<li class='page-item" . ($page === 1 ? " disabled" : "") . "'><a class='page-link' href='?page=$prev'>« previous</a></li>";

// First pages
$pagination .= "<li class='page-item" . ($page <= 2 ? " active" : "") . "'><a class='page-link' href='?page=1'>1</a></li>";
$pagination .= "<li class='page-item" . ($page <= 3 ? " active" : "") . "'><a class='page-link' href='?page=2'>2</a></li>";

// Ellipsis
$pagination .= "<li class='page-item disabled'><span class='page-link'>...</span></li>";

// Main pagination
if ($lastpage > 5 + ($adjacents * 2)) {
    // Close to beginning
    if ($page < 1 + ($adjacents * 2)) {
        for ($i = 3; $i <= 4 + ($adjacents * 2); $i++) {
            $pagination .= "<li class='page-item" . ($i === $page ? " active" : "") . "'><a class='page-link' href='?page=$i'>$i</a></li>";
        }
    }
    // Close to end
    elseif ($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2)) {
        for ($i = $page - $adjacents; $i <= $page + $adjacents; $i++) {
            $pagination .= "<li class='page-item" . ($i === $page ? " active" : "") . "'><a class='page-link' href='?page=$i'>$i</a></li>";
        }
    }
    // In middle
    else {
        $pagination .= "<li class='page-item" . ($lpm1 === $page ? " active" : "") . "'><a class='page-link' href='?page=$lpm1'>$lpm1</a></li>";
        $pagination .= "<li class='page-item" . ($lastpage === $page ? " active" : "") . "'><a class='page-link' href='?page=$lastpage'>$lastpage</a></li>";
    }
}
else {
    for ($i = 3; $i <= $lastpage; $i++) {
        $pagination .= "<li class='page-item" . ($i === $page ? " active" : "") . "'><a class='page-link' href='?page=$i'>$i</a></li>";
    }
}

// Ellipsis
$pagination .= "<li class='page-item disabled'><span class='page-link'>...</span></li>";

// Last pages
$pagination .= "<li class='page-item" . ($page >= $lastpage - 2 ? " active" : "") . "'><a class='page-link' href='?page=$lpm1'>$lpm1</a></li>";
$pagination .= "<li class='page-item" . ($page >= $lastpage - 1 ? " active" : "") . "'><a class='page-link' href='?page=$lastpage'>$lastpage</a></li>";

// Next button
$pagination .= "<li class='page-item" . ($page >= $lastpage ? " disabled" : "") . "'><a class='page-link' href='?page=$next'>next »</a></li>";

$pagination .= "</ul></nav>";

if ($lastpage <= 1) {
    $pagination = "";
}

echo $pagination;

// Display data
foreach ($data as $row) {
    // Display row data
}

echo $pagination;</code>

This algorithm uses the adjacents variable to control the number of adjacent pages shown on each side of the current page. It also includes the following features:

  • Ellipsis: If there are more pages than can be displayed, it uses an ellipsis to truncate the page list.
  • First and last pages: It always shows the first and last pages, regardless of the current page.
  • Disabled buttons: It disables the previous and next buttons when the current page is the first or last page, respectively.
  • Active class: It adds the "active" class to the current page's link.

The above is the detailed content of How to Limit Pagination Links in PHP with a Smart Pagination Algorithm?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn