分页问题[PHP]

And*_*son 2 php logic pagination

所以我在PHP中这样做,但这是一个逻辑问题所以我会尽量把它写成一般.

从这里开始,这个分页脚本是如何工作的:

  1. for(画前三页链接)
  2. if(如果#1页面和#3页面之间有页面,绘制省略号(...))
  3. for(绘制当前页面和链接两侧的两页)
  4. if(绘制elipsis(...)如果#3页面和#5页面之间有页面)
  5. for(画最后三页链接)

问题是,当页面数量很少时(我在页面计数为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;
}
Run Code Online (Sandbox Code Playgroud)

因此,我认为最好的想法是修改两个省略号if语句中的一个以包含这样的情况,但是我已经尝试过并且难倒了.

另请注意,为了便于阅读,我将这段代码浓缩,所以请不要给出一些提示,例如"for循环无效,因为它们会重新计算current_page - 每次迭代2次",因为我知道:)


对于那些想要查看此逻辑当前如何工作的细分的人,这里是使用迭代$ page_count和$ current_page的示例输出(已修改). http://rafb.net/p/TNa56h71.html

小智 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] 
Run Code Online (Sandbox Code Playgroud)