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)] = '&lt;&lt;';
    if( 
$page_min>$result[$url_fn($page_min-1)] = '&lt;';
    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.'&hellip;'.$max;
        
$result[$url] = ($min!=$max)? $label$min;
    }
    if( 
$page_max+1<$last_page $result[$url_fn($page_max+1)] = '&gt;';
    if( 
$page_max<$last_page $result[$url_fn($last_page)] = '&gt;&gt;';
    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__);

?>