我正在尝试实现分页,并且需要计算项目偏移量以用于限制我的结果集。我在计算页面的第一项应具有的索引时遇到问题。
例如。
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,但这应该是语言无关的
想知道这是否应该在数学堆栈交换站点
答案 0 :(得分:89)
使用offset = (page - 1) * itemsPerPage + 1
。
答案 1 :(得分:33)
老实说,取决于。我不是PHP的人,但我会把它们都放在那里。如果您将记录拉入某种形式的集合(列表,数组等),那么您的公式应为:
offset = (page - 1) * itemsPerPage
这是因为大多数(再次,我不是PHP人员)数组和列表使用0作为他们的第一个元素。如果他们没有使用0作为他们的第一个元素和/或你从一个表或其他ID从1开始的东西,那么它应该是:
offset = (page - 1) * itemsPerPage + 1
我希望这很清楚并有所帮助。
答案 2 :(得分:9)
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'
答案 3 :(得分:4)
以JS为例,对于渐进式网络应用人员......
JS数组具有原型方法.slice(start, end)
overview here它将起始索引和结束索引作为参数。
我发现计算两个索引的最简单方法如下:
开始索引
var start = parseInt((selectedPage - 1) * resultsPerPage);
结束指数
var end = parseInt(selectedPage * resultsPerPage);
<强>执行强>
var myPaginatedArray.slice(start, end);
答案 4 :(得分:2)
一个涵盖所有场景的简单分页方程为:
$page = $_GET['page'];
$items_per_page = 20; //for example
$offset = 0; //initial offset
if ($page != 1) {
$offset = ($page * $items_per_page) - $items_per_page;
}
给出每页个项目= 5
输出
页面= 1时,偏移= 0
页面= 2时,偏移= 5
页面= 3时,偏移= 10
页面= 4时,偏移= 15 。 。
答案 5 :(得分:1)
我想添加以下内容来显示例如:
查看 32 个项目中的 21-30 。
在此示例中:
itemsPerPage = 10
page = 3
totalItems = 32
总共有4页,最后一页仅显示 2 个项目。以下对我有用:
(page - 1) * itemsPerPage + 1 + "-" +
Math.Min((page - 1) * itemsPerPage + itemsPerPage , totalItems ) + " of " +
totalItems + " items."
对不起,严格来说是C#,但是这个主意应该很清楚。 Math.Min(x,y)返回两个参数中较小的一个。可能有一个更简单的解决方案,无需使用Math.Min即可计算上限。
答案 6 :(得分:0)
使用此
$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 "<br/><a href='?p=$i'>".$i;
}
答案 7 :(得分:0)
我之前在Angular 4中遇到过这个问题,这是一个模板的编辑,其中的分页列表更加简单:
<div *ngFor="let item of pagedItems; let i = index">
<div class="item-caption">
Item {{(currentPage - 1) * itemsPerPage + (i + 1)}} of {{totalItemsDownloaded}}
</div>
<div class="item-name">{{item.name}}</div>
</div>
我点击Prev&amp ;;总是很方便currentPage
下一个按钮,但初始化为1,itemsPerPage
作为应用程序设置,totalItemsDownloaded
是WebAPI调用报告的总项数。
我希望它有所帮助
答案 8 :(得分:0)
我认为这是完美的,涵盖了所有情况。
$ offset =($ pageLimit * $ page)-$ pageLimit;
答案 9 :(得分:0)
使用以下公式,效果很好:
start_index
:(page_number - 1) * per_page
end_index
:start_index + (per_page - 1)
(通常我们在 SQL 中只指定 per_page - 1
)page_number | start_index | end_index | per_page | formula for start_index
1 | 0 | 24 | 25 | (page_number - 1) * per_page
2 | 25 | 49 | 25 | (page_number - 1) * per_page
3 | 50 | 99 | 25 | (page_number - 1) * per_page
答案 10 :(得分:0)
以下是在触发每个页面事件时计算偏移量的标准且最简单的方法。
偏移量 = ((pageNumber-1) * itemPerPage + 1)-1;
pageNumber = 1
itemPerPage = 10
offset = ((pageNumber-1) * itemPerPage + 1)-1;
console.log("offset for 1st page", offset)
pageNumber = 2
offset = ((pageNumber-1) * itemPerPage + 1)-1;
console.log("offset for 2nd page", offset)
pageNumber = 3
offset = ((pageNumber-1) * itemPerPage + 1)-1;
console.log("offset for 3rd page", offset)