1

如果这是解决此问题的错误站点,我深表歉意,因为它与数学有关而不是编程。我正在尝试以 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 编写这个公式。

4

3 回答 3

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";

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

于 2012-10-03T22:22:29.373 回答
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[]数组是一组页面链接。注意我的实现有一个隐藏的错误,你能看到吗?

于 2012-10-03T00:28:32.027 回答
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;
}
于 2012-10-03T21:32:09.103 回答