分页代码是PHPer接触的最多的代码之一。很多PHPer都自行实现过分页程序,或者用过相关的分页函数。
分页函数
首先回顾一下分页函数的输入与输出。我们拿一个较简单的模型来做说明。
函数输入:
- 记录总数
- 每页记录数
- 当前页数
函数输出
- 偏移量$offset、记录数$limit(在MySQL中执行LIMIT $limit OFFSET $offset)
- 总页数$total_pages
- 上一页$previous_page
- 当前页$current_page
- 下一页$next_page
分页导航栏
今天,我让一同事根据以上效果,开发一个分页导航,满足以下要求:
- 显示离当前页最近的5页,包括当前页
- 不足5页时,尽可能多的显示

举个几个例子:
- 总页数为5,当前页为1~5任意一页,分页导航显示:1 2 3 4 5
- 总页数为6,当前页为5,分页导航显示:2 3 4 5 6
- 总页数为100,当前页为50,分页导航显示:48 49 50 51 52
同事看了这个要求,立马写了以下代码:
<?php if ($total_pages <= 5) :?> <?php for($i=1; $i<=$total_pages; $i++) :?> <?php if($i == $current_page) :?> <a class='selected'><?php echo $i; ?></a> <?php else :?> <a href="<?php echo $page->url($i); ?>"><?php echo $i; ?></a> <?php endif;?> <?php endfor;?> <?php else :?> <?php if($current_page <= 3) :?> <?php for($i=1; $i<=5; $i++) :?> <?php if($i == $current_page) :?> <a class='selected'><?php echo $i; ?></a> <?php else :?> <a href="<?php echo $page->url($i); ?>"><?php echo $i; ?></a> <?php endif;?> <?php endfor;?> <?php elseif($current_page+3 > $total_pages) :?> <?php for($i=$total_pages-4; $i<=$total_pages; $i++) :?> <?php if($i == $current_page) :?> <a class='selected'><?php echo $i; ?></a> <?php else :?> <a href="<?php echo $page->url($i); ?>"><?php echo $i; ?></a> <?php endif;?> <?php endfor;?> <?php else :?> <?php for($i=$current_page-2; $i<=$current_page+2; $i++) :?> <?php if($i == $current_page) :?> <a class='selected'><?php echo $i; ?></a> <?php else :?> <a href="<?php echo $page->url($i); ?>"><?php echo $i; ?></a> <?php endif;?> <?php endfor;?> <?php endif;?> <?php endif; ?>
代码(很可能)满足了要求,但逻辑太多,很容易出错,因此,我建议:
- 分页导航分为两个部分:确定页数、显示页数
- 首先根据分页函数的结果,将应当显示的页码按顺序放入一数组
- 从数组中读出页数,一一加以处理和显示
我告诉他这样的好处:
- 代码职责分离,容易排错
- 代码较精简,重复代码少
听了我的建议,他立马修改了代码:
<?php
if($total_pages <= 5)
{
$begin = 1;
$end = $total_pages;
}
else
{
if ($current_page <= 3)
{
$begin = 1;
$end = 5;
}
elseif($current_page+3 > $total_pages)
{
$begin = $total_pages-4;
$end = $total_pages;
}
else
{
$begin = $current_page-2;
$end = $current_page+2;
}
}
?>
<?php for($i=$begin; $i<=$end; $i++) :?>
<?php if($i == $current_page) :?>
<a class='selected'><?php echo $i; ?></a>
<?php else :?>
<a href="<?php echo $page->url($i); ?>"><?php echo $i; ?></a>
<?php endif;?>
<?php endfor;?>
粗看了一下,对布局挺满意。由于页码是连续的,给定起始页和终止页,就可以把分页导航定下来了。
但是复杂的逻辑代码仍然不让人满意。于是我写了以下代码给他:
<?php $begin = $current_page-2>1 ? $current_page-2 : 1; $end = $begin+4>$total_pages ? $total_pages : $begin+4; ?>
根据我的思想,最终,他用如下的代码,完成了上述功能:
<?php $begin = $current_page-2 > 1 ? $current_page-2 : 1; $end = $begin+4 > $total_pages ? $total_pages : $begin+4; $begin = $end - 4 < 1 ? 1 : $end - 4; ?> <?php for($i=$begin; $i<=$end; $i++) :?> <?php if($i == $current_page) :?> <a class='selected'><?php echo $i; ?></a> <?php else :?> <a href="<?php echo $page->url($i); ?>"><?php echo $i; ?></a> <?php endif;?> <?php endfor;?>
代码优化之我见
点击查看相关文章《代码优化之我见》
标签:PHP, SQL, 代码优化, 代码结构, 分页, 架构, 结构设计