生成分页超链接的公式?

时间:2012-10-03 00:20:13

标签: php math pagination

我很抱歉这个问题是错误的网站,因为它比编程更加数学相关。我正在尝试用Google风格的方式编写一系列7页链接。基本上,它将是7个数字,其中s是我的起始值。我在计算起始值时遇到了麻烦。

事先,系列中的最大值是可变的,具体取决于用户提供的搜索条件,它可能小于,大于或等于7.在我的公式写入尝试中,我一直在调用此值G。我也知道用户选择的页码。我一直在调用这个值p所以,例如,如果g是21,我需要生成这些数字序列,其中粗体数等于p:

1 2 3 4 5 6 7

1 2 3 4 5 6 7

1 2 3 4 5 6 7

1 2 3 4 5 6 7

4 5 6 7 8 9 10

5 6 7 8 9 10 11

15 16 17 18 19 20 21

只要我可以使用可用信息确定起始值,其他所有内容都将落实到位。任何人都可以建议我如何使用现有信息计算我的起始值?如果它是相关的,我将用PHP编写这个公式。

3 个答案:

答案 0 :(得分:2)

假设您需要$n个链接,$g是页数,在您的情况$n = 7中,起始值$s的范围只能是1 } $g - ($n - 1)

一般情况下,当您未超出这些限制时,起始值$s$s = $p - floor($n / 2)的页码相关。

将所有这些放在PHP函数中:

// $p -- user's current page
// $g -- total number of pages
// $n -- number of links
function start_link($p, $g, $n)
{
    $s = $p - floor($n / 2);
    if($s < 1)
    {
        return 1;
    }
    $max_s = $g - ($n - 1);
    if($s > $max_s)
    {
        return $max_s;
    }
    return $s;
}

您可以按如下方式测试此功能:

print start_link(1,21,7) . "\n";
print start_link(2,21,7) . "\n";
print start_link(3,21,7) . "\n";
print start_link(4,21,7) . "\n";
print start_link(7,21,7) . "\n";
print start_link(8,21,7) . "\n";

这将打印您在问题中提供的示例序列的起始页。

答案 1 :(得分:0)

这不是一个公式,它是一个算法(因为它涉及一系列迭代步骤......除非你使用的是Haskell)。

这是我使用的算法:

Int32[] CreateLinks(Int32 currentPageNumber, Int32 totalPages) {
    Int32[] links = new Int32[ Math.Min( totalPages, 10 ) ];
    Int32 start = currentPageNumber < 5 ? 1 : currentPageNumber;
    start = currentPageNumber > totalPages - 5 ? totalPages - 10 : start;
    for(int i=0;i<links.Length;i++) {
        links[i] = start + i;
    }
}

Int32[]数组是页面链接的集合。注意我的实现有一个隐藏的bug,你能看到吗?

答案 2 :(得分:0)

这是我最后编写的(PHP)代码。但是这段代码实际上计算了9(而不是7)搜索页面链接的开始和停止页面。

if ($pagecount < 1) $start_page = 0;
else{
    $hyperlink_start_page = $hyperlink_end_page = $current_page;
    $hyperlink_start_page = $hyperlink_start_page - 4;
    $offset = 0;

    if ($hyperlink_start_page < 1 ){
        $offset = 1 - $hyperlink_start_page;
        $hyperlink_start_page = 1;
    }

    $hyperlink_end_page = $hyperlink_end_page + 4 + $offset;
    $offset = 0;

    if ($hyperlink_end_page > $lastpage ){
        $offset = $hyperlink_end_page - $pagecount;
        $hyperlink_end_page = $pagecount;
    }

    $hyperlink_start_page = $hyperlink_start_page - $offset;
    if ($hyperlink_start_page < 1 ) $hyperlink_start_page = 1;
}