PHP分页算法
<html>
<head>
<link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
<script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<?php
$page = isset($_GET['page']) ? $_GET['page'] : 1;
echo getPaginationString($page, $total = 80, $limit = 5, $adjacents = 1, $targetpage = '/php/demo.php', $pagestring = '?page=');
//$page = isset($_GET['page']) ? $_GET['page'] : 1;
//echo getPaginationString2($page, $total = 80, $limit = 5, $showPageCount = 5, $targetpage = '/php/demo.php', $pagestring = '?page=');
?>
</div>
</body>
</html>
<?php
//function to return the pagination string
function getPaginationString($page = 1, $totalitems, $limit = 15, $adjacents = 3, $targetpage = "/", $pagestring = "?page=")
{
//defaults
if(!$adjacents) $adjacents = 1;
if(!$limit) $limit = 15;
if(!$page) $page = 1;
if(!$targetpage) $targetpage = "/";
//other vars
$prev = $page - 1; //previous page is page - 1
$next = $page + 1; //next page is page + 1
$lastpage = ceil($totalitems / $limit); //lastpage is = total items / items per page, rounded up.
$lpm1 = $lastpage - 1; //last page minus 1
/*
Now we apply our rules and draw the pagination object.
We're actually saving the code to a variable in case we want to draw it more than once.
*/
$pagination = "";
if($lastpage > 1)
{
$pagination .= "<ul class="pagination"";
if(isset($margin, $padding))
{
$pagination .= " style="";
if($margin)
$pagination .= "margin: $margin;";
if($padding)
$pagination .= "padding: $padding;";
$pagination .= """;
}
$pagination .= ">";
//previous button
if ($page > 1)
$pagination .= "<li><a href="$targetpage$pagestring$prev">« prev</a></li>";
else
$pagination .= "<li><span class="disabled">« prev</span></li>";
//pages
if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up
{
for ($counter = 1; $counter <= $lastpage; $counter++)
{
if ($counter == $page)
$pagination .= "<li><span class="current">$counter</span></li>";
else
$pagination .= "<li><a href="" . $targetpage . $pagestring . $counter . "">$counter</a></li>";
}
}
elseif($lastpage >= 7 + ($adjacents * 2)) //enough pages to hide some
{
//close to beginning; only hide later pages
if($page < 1 + ($adjacents * 3))
{
for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
{
if ($counter == $page)
$pagination .= "<li><span class="current">$counter</span></li>";
else
$pagination .= "<li><a href="" . $targetpage . $pagestring . $counter . "">$counter</a></li>";
}
$pagination .= "<li><span class="elipses">...</span></li>";
$pagination .= "<li><a href="" . $targetpage . $pagestring . $lpm1 . "">$lpm1</a></li>";
$pagination .= "<li><a href="" . $targetpage . $pagestring . $lastpage . "">$lastpage</a></li>";
}
//in middle; hide some front and some back
elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
{
$pagination .= "<li><a href="" . $targetpage . $pagestring . "1">1</a></li>";
$pagination .= "<li><a href="" . $targetpage . $pagestring . "2">2</a></li>";
$pagination .= "<li><span class="elipses">...</span></li>";
for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
{
if ($counter == $page)
$pagination .= "<li><span class="current">$counter</span></li>";
else
$pagination .= "<li><a href="" . $targetpage . $pagestring . $counter . "">$counter</a></li>";
}
$pagination .= "<li><a href='javascript:;'>...</a></li>";
$pagination .= "<li><a href="" . $targetpage . $pagestring . $lpm1 . "">$lpm1</a></li>";
$pagination .= "<li><a href="" . $targetpage . $pagestring . $lastpage . "">$lastpage</a></li>";
}
//close to end; only hide early pages
else
{
$pagination .= "<li><a href="" . $targetpage . $pagestring . "1">1</a></li>";
$pagination .= "<li><a href="" . $targetpage . $pagestring . "2">2</a></li>";
$pagination .= "<li><span class="elipses">...</span></li>";
for ($counter = $lastpage - (1 + ($adjacents * 3)); $counter <= $lastpage; $counter++)
{
if ($counter == $page)
$pagination .= "<li><span class="current">$counter</span></li>";
else
$pagination .= "<li><a href="" . $targetpage . $pagestring . $counter . "">$counter</a></li>";
}
}
}
//next button
if ($page < $counter - 1)
$pagination .= "<li><a href="" . $targetpage . $pagestring . $next . "">next »</a></li>";
else
$pagination .= "<li><span class="disabled">next »</span></li>";
$pagination .= "</ul>
";
}
return $pagination;
}
/**
function getPaginationString2($page = null, $totalItems = null, $limit = 5, $showPageCount = 4, $target = '/', $pageString = '?page=')
{
$totalPage = ceil($totalItems / $limit); // compute total page
if(($offset = ($page + floor($showPageCount / 2))) > $totalPage)
$offset = $totalPage;
if($page + floor($showPageCount / 2) > $totalPage)
$counter = $totalPage - floor($showPageCount / 2);
else
$counter = ($computerPage = $page - floor($showPageCount / 2)) > 0 ? $computerPage : 1;
$pagination = '<ul class="pagination">';
for($counter; $counter < $offset; $counter++)
{
$pagination .= '<li><a href="'.$target.$pageString.$counter.'">'.$counter . '</a></li>';
}
$pagination .= '</ul>';
return $pagination;
}
*/