计算分页的项目偏移量
Posted
技术标签:
【中文标题】计算分页的项目偏移量【英文标题】:Calculating item offset for pagination 【发布时间】:2011-04-01 01:31:27 【问题描述】:这似乎是非常简单的数学,但不知何故,我的大脑无法思考......
我正在尝试实现分页,并且需要计算项目偏移量以用于限制我的结果集。我在计算页面的第一项应具有的索引时遇到问题。
例如。
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 但这应该是独立于语言的
想知道这是否应该在数学堆栈交换站点中
【问题讨论】:
【参考方案1】:使用offset = (page - 1) * itemsPerPage + 1
。
【讨论】:
不应该是:offset = (page - 1) * itemsPerPage 否则将永远不会显示结果编号 1? 您好,您的意思是偏移量 = (page_number - 1) * itemsPerPage;如果是这样,结果会不会生成大于 itemsPerPage 数字的数字? 我是想以Jiew的例子来回答这个问题。他显然是在计算每一页的第一个项目编号;所以 firstItemForPage(1)=(1-1)·10+1=1,firstItemForPage(2)=(2-1)·10+1=11,以此类推。$offset = ($pageLimit * $page) - $pageLimit;
我已经用了一年多了。你也可以试试看。【参考方案2】:
老实说取决于。我不是 PHP 人,但我会把两者都放在那里。如果您要将记录拉入某种形式的集合(列表、数组等),那么您的公式应该是:
offset = (page - 1) * itemsPerPage
这是因为大多数(同样,我不是 PHP 人)数组和列表使用 0 作为它们的第一个元素。如果他们的第一个元素不使用 0 和/或您从表格或 ID 从 1 开始的其他东西中提取,那么它应该是:
offset = (page - 1) * itemsPerPage + 1
我希望这很清楚并有所帮助。
【讨论】:
“通常”每个人都以 0 为起点,无论是 PHP、javascript 等【参考方案3】: 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'
【讨论】:
【参考方案4】:以 JS 为例,对于渐进式 web app 的人...
JS 数组有原型方法 .slice(start, end)
overview here 它需要一个开始索引和一个结束索引作为参数。
我发现计算两个索引的最简单方法如下;
起始索引
var start = parseInt((selectedPage - 1) * resultsPerPage);
结束索引
var end = parseInt(selectedPage * resultsPerPage);
执行
var myPaginatedArray.slice(start, end);
【讨论】:
【参考方案5】:我认为这个很完美,涵盖了所有场景。
$offset = ($pageLimit * $page) - $pageLimit;
【讨论】:
可以省略乘法大括号【参考方案6】:我想我会添加以下内容来显示文本,例如:
查看 21-30 个项目,共 32 个项目。
在这个例子中:
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
可能有一个更简单的解决方案来计算上限。
【讨论】:
【参考方案7】:一个涵盖所有场景的简单分页方程将是:
$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
输出
当page = 1,offset = 0
当page = 2,offset = 5
当page = 3, offset = 10
当 page = 4,offset = 15 . . .
【讨论】:
【参考方案8】:使用这个
$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;
【讨论】:
【参考方案9】:我以前在 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>
我总是方便 currentPage
作为点击 Prev 和 Next 按钮的结果,但初始化为 1,itemsPerPage
作为应用设置,totalItemsDownloaded
是 WebAPI 调用报告的总项目数。
希望对你有帮助
【讨论】:
【参考方案10】:使用以下公式,效果很好:
对于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
【讨论】:
【参考方案11】:在触发每个页面事件时,以下是计算偏移量的标准且最简单的方法。
offset = ((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)
【讨论】:
是的,这就是公认的答案所说的以上是关于计算分页的项目偏移量的主要内容,如果未能解决你的问题,请参考以下文章
具有自定义数据源偏移量的 Android 分页库 RecyclerView 中的项目