2008-11-21 83 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/