2008-11-21 84 views
2

所以我在PHP这样做,但它是一个逻辑问题,所以我会尽力把它写成一般越好。分页问题[PHP]

要启动这里的这个分页脚本是如何工作的:

  1. 为(画前三页链接
  2. 如果有#1的页面之间的页面
  3. 如果(平局省略号(...) (和#3的网页)
  4. 为(吸取当前页和每边两页它链接
  5. 如果画省略号(...)如果有#3的页面和#5的页)
  6. 为(得出最后三个页面之间的页面链接

的问题是,当有大量低页面(当页面数量为10时我注意到了)应该有一个省略号,但没有绘制。

走上代码:

$page_count = 10; //in actual code this is set properly 
$current_page = 1; //in actual code this is set properly 

for ($i = 1;$i <= 3;$i++) 
{ 
    if ($page_count >= $i) 
     echo $i; 
} 

if ($page_count > 3 && $current_page >= 7) 
    echo "..."; 

for ($i = $current_page - 2;$i <= current_page + 2;$i++) 
{ 
    if ($i > 3 && $i < $page_count - 2) 
     echo $i; 
} 

if ($page_count > 13 && $current_page < $page_count - 5) 
    echo "..."; 

for ($i = $page_count - 2;$i <= $page_count;$i++) 
{ 
    if ($page_count > 3) 
     echo $i; 
} 

所以我想最好的办法将是修改两个省略号的一个if语句,包括像这样的情况,不过我试过和很为难。

同时请注意,我这个凝结代码可读性的缘故,所以请不要给像“那些循环是无效的,因为他们将重新计算CURRENT_PAGE - 2每次迭代”的提示,因为我知道:)


对于那些谁希望看到的这个逻辑目前是如何工作的故障,这里是一个输出示例(修改)与迭代$ PAGE_COUNT和$ CURRENT_PAGE。 http://rafb.net/p/TNa56h71.html

+0

这不是一个PHP的问题!请不要添加PHP标签,因为代码示例甚至没有用PHP编写! – 2008-11-21 06:32:17

+0

您可能希望提供*工作*示例代码,以便自己测试您的逻辑的人员不必使用自己的语言重新实现您的'伪代码',以便他们可以测试它做任何事情。 – 2008-11-21 06:37:22

回答

5
<?php 

/** 
* windowsize must be odd 
* 
* @param int $totalItems 
* @param int $currentPage 
* @param int $windowSize 
* @param int $anchorSize 
* @param int $itemsPerPage 
* @return void 
*/ 
function paginate($totalItems, $currentPage=1, $windowSize=3, $anchorSize=3, $itemsPerPage=10) { 
    $halfWindowSize = ($windowSize-1)/2; 

    $totalPages = ceil($totalItems/$itemsPerPage); 
    $elipsesCount = 0; 
    for ($page = 1; $page <= $totalPages; $page++) { 
     // do we display a link for this page or not? 
     if ($page <= $anchorSize || 
      $page > $totalPages - $anchorSize || 
      ($page >= $currentPage - $halfWindowSize && 
      $page <= $currentPage + $halfWindowSize) || 
      ($page == $anchorSize + 1 && 
      $page == $currentPage - $halfWindowSize - 1) || 
      ($page == $totalPages - $anchorSize && 
      $page == $currentPage + $halfWindowSize + 1)) 
     { 
      $elipsesCount = 0; 
      if ($page == $currentPage) 
       echo ">$page< "; 
      else 
       echo "[$page] "; 
     // if not, have we already shown the elipses? 
     } elseif ($elipsesCount == 0) { 
      echo "... "; 
      $elipsesCount+=1; // make sure we only show it once 
     } 
    } 
    echo "\n"; 
} 

// 
// Examples and output 
// 

paginate(1000, 1, 3, 3); 
// >1< [2] [3] ... [98] [99] [100] 

paginate(1000, 7, 3, 3); 
// [1] [2] [3] ... [6] >7< [8] ... [98] [99] [100] 

paginate(1000, 4, 3, 3); 
// [1] [2] [3] >4< [5] ... [98] [99] [100] 

paginate(1000, 32, 3, 3); 
// [1] [2] [3] ... [31] >32< [33] ... [98] [99] [100] 

paginate(1000, 42, 7, 2); 
// [1] [2] ... [39] [40] [41] >42< [43] [44] [45] ... [99] [100] 
2

这可能是一个过于复杂的解决方案,但它的工作原理。

我用在这里,而不是仅仅打印的阵列,它可以让我“办了”的逻辑。当“左和页面右侧”正好与左,右肩膀一致发生问题的

部分。

function cdotinator ($current_page, $page_count) 
{ 
    $stepsize = 3; 
    $elipse = '...'; 
    # Simple Case. 
    if ($page_count <= 2 * $stepsize) 
    { 
    $out = range(1, $page_count); 
    $out[$current_page - 1 ] = '*' . $current_page . '*'; 
    return $out; 
    } 
    #Complex Case 
    # 1) Create All Pages 
    $out = range(1, $page_count); 
    # 2) Replace "middle" pages with "." placeholder elements 
    for($i = $stepsize+1 ; $i <= ($page_count - $stepsize) ; $i ++) 
    { 
    $out[ $i - 1 ] = '.' ; 
    } 
    # 3.1) Insert the pages around the current page 
    for($i = max(1,($current_page - floor($stepsize/2))) ; 
     $i <= min($page_count,($current_page + floor($stepsize/2))); 
     $i ++) 
    { 
    $out[ $i - 1] = $i; 
    } 
    # 3.2 Bold Current Item 
    $out[ $current_page - 1 ] = '*' . $current_page . '*' ; 

    # 4) Grep out repeated '.' sequences and replace them with elipses 
    $out2 = array(); 
    foreach($out as $i => $v) 
    { 
    # end, current == peek() 
    end($out2); 
    if(current($out2) == $elipse and $v == '.') 
    { 
     continue; 
    } 
    if($v == '.') 
    { 
     $out2[] = $elipse; 
     continue; 
    } 
    $out2[]= $v; 
    } 

    return $out2; 

} 

输出可以在这里看到:http://dpaste.com/92648/