计算分页的项目偏移量
这似乎很简单,但我的大脑无法思考...
我正在尝试实现分页,并且需要计算项偏移量以用于限制我的结果集。 我在计算页面的第一项应该具有的索引时遇到问题。
例如。
with 1 page having 10 items
page 1 will have items 1 - 10
page 2 ............... 11 - 20
page 3 ............... 21 - 30
我想到了
offset = page * itemsPerPage + 1
但这不是第1页的情况。为此必须有一个公式吗? 我正在使用PHP / Zend_Paginator / Doctrine2,但这应该与语言无关
想知道这是否应该在数学堆栈交换站点中
Jiew Meng asked 2020-06-22T20:02:31Z
7个解决方案
93 votes
使用offset = (page - 1) * itemsPerPage + 1。
Gumbo answered 2020-06-22T20:02:45Z
34 votes
老实说。 我不是PHP人士,但是我会把两者都放在那里。 如果要将记录放入某种形式的集合(列表,数组等)中,则公式应为:
offset = (page - 1) * itemsPerPage
这是因为大多数(同样,我不是PHP人士)数组和列表的第一个元素都使用0。 如果他们的第一个元素不使用0,并且/或者您从ID开头为1的表或其他内容中提取数据,则应该为:
offset = (page - 1) * itemsPerPage + 1
我希望这很清楚,对您有所帮助。
XstreamINsanity answered 2020-06-22T20:03:14Z
11 votes
start = (page - 1) * itemsPerPage + 1
end = totalItems
if (itemsPerPage < totalItems) {
end = itemsPerPage * page
if (end > totalItems) {
end = totalItems;
}
}
// e.g. "21-30 of 193 items"
start + '-' + end + ' of ' + totalItems + ' items'
mynameistechno answered 2020-06-22T20:03:30Z
4 votes
以JS为例,适合渐进式网络应用人员。
JS数组具有原型方法.slice(start, end),在此概述中,它以开始索引和结束索引作为参数。
我发现计算两个索引的最简单方法如下:
开始索引
var start = parseInt((selectedPage - 1) * resultsPerPage);
结束索引
var end = parseInt(selectedPage * resultsPerPage);
执行
var myPaginatedArray.slice(start, end);
Mark Carpenter Jr answered 2020-06-22T20:04:12Z
1 votes
我认为这是完美的,涵盖了所有情况。
$offset = ($pageLimit * $page) - $pageLimit;
ManojP answered 2020-06-22T20:04:31Z
0 votes
用这个
$row_page = 5; //items per page
if(isset($_GET['p'])){
$page_num = $_GET['p'];
} else {
$page_num = 0;
}
$offset = ( $page_num ) * $row_page;
$cn = 31;
$pg = (int)ceil($cn / $row_page);
for ($i = 1; $i <= $pg; $i++){
echo "".$i;
}
ايكيو المعلوماتية answered 2020-06-22T20:04:51Z
0 votes
我以前在Angular 4中已经遇到过这个问题,这是对模板的编辑,其中带有分页的列表变得更加简单:
Item {{(currentPage - 1) * itemsPerPage + (i + 1)}} of {{totalItemsDownloaded}}
单击“上一个”和“下一个”按钮后,我总是很方便currentPage,但将其初始化为1,将itemsPerPage作为应用程序设置,并且totalItemsDownloaded是WebAPI调用报告的总项目数。
希望对您有所帮助
Sparker73 answered 2020-06-22T20:05:20Z