代码优化之分页输出

2010年2月8日 由 Hackfan | 有 416 人次阅读 留言 »

  分页代码是PHPer接触的最多的代码之一。很多PHPer都自行实现过分页程序,或者用过相关的分页函数。

分页函数

  首先回顾一下分页函数的输入与输出。我们拿一个较简单的模型来做说明。

  函数输入:

  1. 记录总数
  2. 每页记录数
  3. 当前页数

  函数输出

  1. 偏移量$offset、记录数$limit(在MySQL中执行LIMIT $limit OFFSET $offset)
  2. 总页数$total_pages
  3. 上一页$previous_page
  4. 当前页$current_page
  5. 下一页$next_page

分页导航栏

   今天,我让一同事根据以上效果,开发一个分页导航,满足以下要求:

  1. 显示离当前页最近的5页,包括当前页
  2. 不足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>&nbsp;
        <?php else :?>
            <a href="<?php echo $page->url($i); ?>"><?php echo $i; ?></a>&nbsp;
        <?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>&nbsp;
            <?php else :?>
                <a href="<?php echo $page->url($i); ?>"><?php echo $i; ?></a>&nbsp;
            <?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>&nbsp;
            <?php else :?>
                <a href="<?php echo $page->url($i); ?>"><?php echo $i; ?></a>&nbsp;
            <?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>&nbsp;
            <?php else :?>
                <a href="<?php echo $page->url($i); ?>"><?php echo $i; ?></a>&nbsp;
            <?php endif;?>
        <?php endfor;?>
    <?php endif;?>
<?php endif; ?>

  代码(很可能)满足了要求,但逻辑太多,很容易出错,因此,我建议:

  1. 分页导航分为两个部分:确定页数、显示页数
  2. 首先根据分页函数的结果,将应当显示的页码按顺序放入一数组
  3. 从数组中读出页数,一一加以处理和显示

  我告诉他这样的好处:

  1. 代码职责分离,容易排错
  2. 代码较精简,重复代码少

  听了我的建议,他立马修改了代码:

<?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>&nbsp;
    <?php else :?>
        <a href="<?php echo $page->url($i); ?>"><?php echo $i; ?></a>&nbsp;
    <?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>&nbsp;
    <?php else :?>
        <a href="<?php echo $page->url($i); ?>"><?php echo $i; ?></a>&nbsp;
    <?php endif;?>
<?php endfor;?>

代码优化之我见

  点击查看相关文章《代码优化之我见

标签:, , , , , ,

相关日志

留下评论