我很抱歉这个问题是错误的网站,因为它比编程更加数学相关。我正在尝试用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编写这个公式。
答案 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;
}