PHP: Simple Pagination

This is a simple pagination snippet I wrote for a Drupal module I was working on. I’ve “unDruaplized” it and now it’s completely independent.

The function will calculate the number of pages to display based on $total and $shown. In addition, it'll append the corresponding page number to the provided $url.

Parameters

This function takes 4 params: 
 (int) $total - total number of results. 100 in our example 
 (int) $page - the page number you're currently on. using $_GET['p'] in our example 
 (int) $shown - number results to display per page. 10 results per page in our example 
 (str) $url - the url each link should have. ?p= in our example

100(results)/10(per page) = 10(pages)

NOTE: All page numbers are incremented by one. This means, the function assumes URL 0 as page 1.

Example Usage

echo handle_pagination(100, (int)$_GET['p'], 10, '?p=');

HTML Output

The following is an example of the markup our snippet below will generate

<div>  
<span>1</span>
<span><a href="?p=1">2</a></span>
<span><a href="?p=2">3</a></span>
<span><a href="?p=3">4</a></span>
<span><a href="?p=4">5</a></span>
...
<span><a href="?p=1">next &rsaquo;</a></span>
<span><a href="?p=9">last &raquo;</a></span>
</div>

Which should produce something like the following:

1 2 3 4 5 ... next › last »

Snippet

<?php  
function handle_pagination($total, $page, $shown, $url) {
$pages = ceil( $total / $shown );
$range_start = ( ($page >= 5) ? ($page - 3) : 1 );
$range_end = ( (($page + 5) > $pages ) ? $pages : ($page + 5) );

if ( $page >= 1 ) {
$r[] = '<span><a href="'. $url .'">&laquo; first</a></span>';
$r[] = '<span><a href="'. $url . ( $page - 1 ) .'">&lsaquo; previous</a></span>';
$r[] = ( ($range_start > 1) ? ' ... ' : '' );
}

if ( $range_end > 1 ) {
foreach(range($range_start, $range_end) as $key => $value) {
if ( $value == ($page + 1) ) $r[] = '<span>'. $value .'</span>';
else $r[] = '<span><a href="'. $url . ($value - 1) .'">'. $value .'</a></span>';
}
}

if ( ( $page + 1 ) < $pages ) {
$r[] = ( ($range_end < $pages) ? ' ... ' : '' );
$r[] = '<span><a href="'. $url . ( $page + 1 ) .'">next &rsaquo;</a></span>';
$r[] = '<span><a href="'. $url . ( $pages - 1 ) .'">last &raquo;</a></span>';
}

return ( (isset($r)) ? '<div>'. implode("\r\n", $r) .'</div>' : '');
}

Originally published at seanwragg.com on December 8, 2010.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.