2008-11-21 4 views
2

Так что я делаю это на PHP, но это логическая проблема, поэтому я постараюсь написать ее как можно больше.Проблема с разбивкой по страницам [PHP]

Для начала вот как это разбиение на страницах скрипт работает:

  1. для (рисовать первую три страницы ссылку)
  2. если (ничья многоточие (...) если есть страницы между страницами # 1 в и # 3 странички)
  3. для (нарисовать текущую страницу и две страницы на каждой стороне она связывает)
  4. если (рисовать elipsis (...) если есть страницы между # 3-х страниц и # 5 страничек)
  5. для (рисовать последних трех страницах ссылки)

Проблема заключается в том, что, когда есть небольшие количества страниц (я заметил это, когда число страниц было в 10), должен быть многоточие, но ни один не нарисован.

Onto кода:

$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; 
} 

Так что я полагаю, лучшая идея будет заключаться в изменении одного из два многоточия, если заявления включать дела, как это, однако я пытался, и я в тупике.

Также обратите внимание, что я конденсируется этот код ради читаемости поэтому, пожалуйста, не дают советов, как «те, для петель неэффективны, потому что они будут пересчитывать current_page - 2 для каждой итерации», потому что я знаю :)


Для тех, кто хочет увидеть разбивку того, как работает эта логика, вот пример вывода (измененный) с итерированием $ page_count и $ current_page. http://rafb.net/p/TNa56h71.html

+0

Это не проблема PHP! Не добавляйте тег PHP, поскольку пример кода даже не написан на PHP! – 2008-11-21 06:32:17

+0

Возможно, вы захотите указать * рабочий код примера, чтобы люди, которые хотят протестировать вашу логику, не должны повторно реализовывать ваш код «psuedo» на своем родном языке, чтобы они могли проверить, что он что-то делает. – 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/

 Смежные вопросы

  • Нет связанных вопросов^_^