长分页分割函数,欢迎拍砖。

#1 syber

感觉还可以优化
 
function makepage($pager, $num = 10)
{
  $left = $pager['current_page'] - $num / 2;
  $right = $pager['current_page'] + $num / 2;
  $start = $left;
  $end = $right;
  if ($pager['total_page'] <= $num)
  {
   $start = $pager['first_page'];
   $end = $pager['last_page'];
  }
  else
  {
   if ($pager['current_page'] <= $num / 2)
   {
    $start = $pager['first_page'];
    $end = $right + $num / 2 - $pager['current_page'] + 1;
   }
   else
   {
    if ($right > $pager['last_page'])
    {
     $end = $pager['last_page'] + 1;
     $start -= $right - $pager['last_page'] - 1;
    }
   }
  }
  return array_slice($pager['all_pages'], $start - 1, $end - $start, true);
}


通过这个函数,把不需要的页码剔除。把all_pages数组最小化

1.jpg2.jpg3.jpg4.jpg5.jpg

2010-12-12 07:06:37

#2 syber

主要是通过计算减少循环开销

2010-12-12 07:10:54

#3 syber

强烈建议将这个想法思路扩展到pager这个类使用,

$this->pager = $sysuserObj->spPager()->getPager(10/*这里加多一个参数,处理'all_pages'数组*/);

2010-12-12 07:14:35

#4 jake

:victory:很好,我之前也想减小这个“all_pages数组”,楼主做的挺实用的。

对于把运算放到getPager函数里面这点,考虑考虑。:loveliness:

2010-12-12 07:30:46

#5 syber

现在来讲解一下思路!

我们可以想象一下,怎样截取一根棍子中的一段。

棍子抓在手上,那个点就是相应page的当前页,初始化时候,先不管3721,按照长度,以手上这点为中间,
  $left = $pager['current_page'] - $num / 2;
  $right = $pager['current_page'] + $num / 2;
两头各取长度的一半,那么,这根棍子的下刀点就描画出来了。
我们现在要做的就是处理这两个下刀点!
if ($pager['total_page'] <= $num)
  {
   $start = $pager['first_page'];
   $end = $pager['last_page'];
  }
太短的棍子,当然直接返回整根了!

好,剩下的棍子,都是符合长度的了!
先看看左下刀点,
else
  {
   if ($pager['current_page'] <= $num / 2)
   {
    $start = $pager['first_page'];
    $end = $right + $num / 2 - $pager['current_page'] + 1;
   }
棍子左边出界了,下刀点没在棍子上!
突出了多少?$num / 2 - $left,没错,就是这么多!
怎么办?没错,把他摆到棍子左边顶端!也就是frist_page了。
那短了啊,没关系,把短的那部分,补到右边,差多少补多少!
现在勾画出来的棍子,左边下刀点就在棍子的最左端了!

左边没突出来怎么办?不管了呗,下刀点还是暂定开始勾画的那里!

现在来看看棍子的右端。
else
   {
    if ($right > $pager['last_page'])
    {
     $end = $pager['last_page'] + 1;
     $start -= $right - $pager['last_page'] - 1;
    }
   }
哦,右边又突出来了!怎么办,没错,跟左边一样,把右边放到棍子的右端。多出来的放到左边!
这样,就把下刀点给画出来了!
可能有人问,放到左边,那左边突出来怎么办?!很简单,如果这个时候左边突出来,肯定这棍子是不够长的!
开始时候已经整根棍子返回了!

如果一开始,不检查棍子长度的话,这里肯定还要在检查一次左边下刀点了。只不过这次检查,只是移动左边下刀点,而不用移动右边了。这是如果前面不检查棍子长度的话!

好了,现在棍子的下刀点是不是确定下来了!!
准备下刀截断棍子咯!
 return array_slice($pager['all_pages'], $start - 1, $end - $start, true);
这里下刀,有个参数,就是第三个,true,是保证截断棍子的中心点在手上抓着那点!
false的话怎样?棍子就变成永远在最左边开始截了。:(

看,截出来的棍子漂亮不?

2010-12-12 19:22:58

#6 jake

厉害,说的挺好的

2010-12-12 20:03:35

#7 yingfeng

很好,这正是我要找的:hug:

2010-12-12 20:24:06

#8 azwl

这样改了是不是更简单一点:)


function makepage($pager, $offset = 4) //这里的$offset表示当前页的左右偏移量
{
$start = 1;
$end = $offset * 2+1;
if ($pager['current_page'] > $offset)
{
  $start = $pager['current_page'] - $offset;
  $end = $pager['current_page'] + $offset;
}
if ($end > $pager['total_page'])
{
  $start = $pager['total_page'] - $offset * 2;
  $end = $pager['total_page'];
}
if ($start < 1) $start = 1;
return array_slice($pager['all_pages'], $start - 1, $end - $start, true);
}


另外说一下关于放到getPage($=num)中,我觉得完全没有必要,因为10个用户可能会有11种分页方法。所以makepage应该有用户定义。

倒是觉得getPage()中的all_pages没有必要存在,因为它总是一组连续的自然数,白白浪费了空间和时间。jake以为呢?

2010-12-13 10:03:25

#9 jake

这样改了是不是更简单一点:)



另外说一下关于放到getPage($=num)中,我觉得完全没有必要,因为10个用户 ...
azwl 发表于 2010-12-13 10:03
all_pages这块,好像的确有些多余,基本上直接for一个循环就行了。

2010-12-13 10:29:48

#10 syber

all_pages确实有些鸡肋的味道
我对smarty不是很熟悉,不知道模板里面有没有其他的循环方式
因为现在大家都用习惯了foreach来循环输出数组成员了
如果smarty能像for那种循环呢,我觉得完全可以把all_pages这个删除掉
makepages这个函数呢,主要是能增强自定义方面。

最好可以load一个分页的模板。思路有点杂,再理一理

2010-12-13 11:01:46

#11 syber

另外,改进的那段代码思路更容易理解了!

2010-12-13 11:03:46

#12 jake

all_pages确实有些鸡肋的味道
我对smarty不是很熟悉,不知道模板里面有没有其他的循环方式
因为现在大家都 ...
syber 发表于 2010-12-13 11:01
smarty 3现在是可以支持for循环了。之前的all_pages的确是为了smarty 2的循环。

2010-12-13 11:37:10

#13 syber

那就很好了,不过这个改动,估计对向下兼容性有点问题了。
如果这部分要改动的话,输出函数多加两个带默认值的参数以向下兼容吧

2010-12-13 11:51:57

#14 helloniu

问下   这个分页函数放在哪里比较好 model里? 还是单独一个函数文件包含进来?      具体如何使用啊   新手   请多包涵  :)

2010-12-27 10:28:12

#15 jake

问下   这个分页函数放在哪里比较好 model里? 还是单独一个函数文件包含进来?      具体如何使用啊   新 ...
helloniu 发表于 2010-12-27 10:28
单独放到函数文件里面,然后注册到模板中使用。

2010-12-27 12:30:42

#16 helloniu

单独放到函数文件里面,然后注册到模板中使用。
jake 发表于 2010-12-27 12:30
注册到模板中使用    没太明白是什么意思    麻烦给个示例吧

2010-12-27 13:55:12