V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ab
V2EX  ›  PHP

请教一个 php 算法。分页导航函数

  •  
  •   ab · 2015-01-03 05:24:23 +08:00 via iPhone · 4072 次点击
    这是一个创建于 3604 天前的主题,其中的信息可能已经有所发展或是发生改变。
    已知文章

    分页变量 $pages
    当前页码变量 $num
    文章链接 $link

    比如第一页为www.xxx.com,第二页www.xxx.com/2

    要求输出前后两个分页和首页末页的分页导航。如何写函数比较高效?

    比如假设pages为 15

    第一页导航为
    1 2 3 ... 15
    第二页为
    1 2 3 4 ... 15
    第三页为
    1 2 3 4 5...15
    第四页导航为
    1 2 3 4 5 6...15
    第五页为
    1...3 4 5 6 7...15
    第六为
    1...4 5 6 7 8...15

    ...

    ...

    第13页为
    1...11 12 13 14 15
    第14页为
    1...12 13 14 15
    最后一页
    1...13 14 15
    9 条回复    2015-01-04 16:18:44 +08:00
    msg7086
        1
    msg7086  
       2015-01-03 06:44:35 +08:00
    只说个思路。把首页、当前页向前向后、最后一页扔进数组。然后unique一下。
    sumhat
        2
    sumhat  
       2015-01-03 08:13:03 +08:00 via Android
    这是一个O(7)的函数,即使写成了O(77),也不影响效率吧
    mcfog
        4
    mcfog  
       2015-01-03 11:35:37 +08:00
    https://gist.github.com/mcfog/2df96e37fc7fe3edbc6e#file-paginator-php-L119
    无他,一个for循环里面有复杂的判断而已
    feiyuanqiu
        5
    feiyuanqiu  
       2015-01-03 12:37:12 +08:00
    这些小东西其实应该自己琢磨的,也没有什么难度,问别人的也不一定就比自己想出来的实现要好。
    这是我刚才写的,比较简单:



    ```php
    <?php
    function simplePaginator($current, $last, $url_func = null, $start = 1, $range = 2, $rule = '...')
    {
    $result = range($current - $range > $start ? $current - $range : $start,
    $current + $range < $last ? $current + $range : $last);

    if (reset($result) != $start) { array_unshift($result, $start, $rule); }
    if (end($result) != $last) { array_push($result, $rule, $last); }

    if ($url_func && function_exists($url_func)) {
    $result = array_map($url_func, $result);
    }

    return $result;
    }

    function singlePagiUrl($p)
    {
    return is_numeric($p)
    ? "<a href='?p={$p}'>{$p}</a>"
    : $p;
    }

    echo '<pre>';print_r(simplePaginator(16, 15, 'singlePagiUrl'));
    ?>
    ```

    楼上不要贴 gist 啊,我卡了半天
    xoxo
        6
    xoxo  
       2015-01-03 12:38:26 +08:00
    何不用一些前端JS框架来做呢
    lincanbin
        7
    lincanbin  
       2015-01-03 12:51:24 +08:00
    @xoxo 这样SEO不行。
    ab
        8
    ab  
    OP
       2015-01-04 02:15:40 +08:00
    @mcfog @feiyuanqiu 谢谢
    bertonzh
        9
    bertonzh  
       2015-01-04 16:18:44 +08:00
    https://github.com/meowtec/page-navigator
    这是我前段时间写的分页,一开始用 js 写的,后来用 Python 和 php 重写了两份。
    算法在 pageAnalyse 方法中,思路和你的不太一样。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1150 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 22:56 · PVG 06:56 · LAX 14:56 · JFK 17:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.