Array
(
[first] => test.php
[prev] => test.php?page=34
[next] => test.php?page=36
[last] => test.php?page=49
)
Array
(
[test.php] => <<
[test.php?page=31] => <
[test.php?page=32] => 321…330
[test.php?page=33] => 331…340
[test.php?page=34] => 341…350
[0] => 351…360
[test.php?page=36] => 361…370
[test.php?page=37] => 371…380
[test.php?page=38] => 381…390
[test.php?page=39] => >
[test.php?page=49] => >>
)
1…10 | 11…20 | 21…30 | 31…40 | 41…50 | 51…60 | 61…70 | > | >>
<?php
function std_paginator($page,$page_size,$items,$url_fn,$links_limit=7) {
$page_max = $last_page = (int)(($items-1)/$page_size);
$page_min = 0;
while( $links_limit<=($page_max-$page_min) ) {
if ( $page_max+$page_min > 2*$page )
$page_max--; else $page_min++;
}
$result = array();
if( $page_min ) $result[$url_fn(0)] = '<<';
if( $page_min>1 ) $result[$url_fn($page_min-1)] = '<';
for( $p=$page_min; $p<=$page_max; $p++ ) {
$url = ($p!=$page)? $url_fn($p): FALSE;
$min = $p*$page_size+1;
$max = min($items,($p+1)*$page_size);
$label = $min.'…'.$max;
$result[$url] = ($min!=$max)? $label: $min;
}
if( $page_max+1<$last_page ) $result[$url_fn($page_max+1)] = '>';
if( $page_max<$last_page ) $result[$url_fn($last_page)] = '>>';
return $result;
}
function rel_paginator($page,$page_size,$items,$url_fn) {
$last_page = (int)(($items-1)/$page_size);
$result = array();
if( $page ) {
$result['first'] = $url_fn(0);
$result['prev'] = $url_fn($page-1);
}
if( $page<$last_page ) {
$result['next'] = $url_fn($page+1);
$result['last'] = $url_fn($last_page);
}
return $result;
}
header('Content-type: text/html'); // No XHTML!
function test_url($page) { return $page?'test.php?page='.$page :'test.php'; }
function dump($data) { echo '<pre>'.htmlspecialchars(print_r($data,TRUE)).'</pre>'; }
dump(rel_paginator(35,10,500,'test_url'));
dump(std_paginator(35,10,500,'test_url'));
$q = array();
foreach( std_paginator(1,10,500,'test_url') as $url=>$label )
$q[] = $url? "<a href=\"$url\">$label</a>": "<strong>$label</strong>";
echo join(' | ',$q);
echo '<br><br>';
show_source(__FILE__);
?>