计算分页的项偏移量

这似乎是一个非常简单的数学问题,但不知为何,我的大脑不能思考..。

我试图实现分页,并将需要计算项目偏移量,以使用限制我的结果集。我有问题计算什么索引的第一个项目的网页应该有。

例如。

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

但是在第一页就不是这样了。一定有配方吧?我使用 PHP/Zend _ Paginator/Doctrine2,但这应该是独立于语言的

不知道这是否应该在数学栈交换站点

113180 次浏览

使用 offset = (page - 1) * itemsPerPage + 1

这要看情况了。我不是 PHP 人士,但我会把两者都放出来。如果你将你的记录放入某种形式的集合(列表,数组,等等) ,那么你的公式应该是:

offset = (page - 1) * itemsPerPage

这是因为大多数(再次强调,我不是一个 PHP 人员)数组和列表的第一个元素使用0。如果它们的第一个元素没有使用0,并且/或者您正在从 ID 从1开始的表或其他元素中提取,那么它应该是:

offset = (page - 1) * itemsPerPage + 1

我希望你说得够清楚了,能有所帮助。

  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'

使用 JS 作为例子,为进步的 Web 应用程序人..。

JS 数组具有原型方法 .slice(start, end) 此处概述,它采用开始索引和结束索引作为参数。

我发现计算两个索引的最简单方法如下所示;

开始索引

var start =  parseInt((selectedPage - 1) * resultsPerPage);

结束索引

var end = parseInt(selectedPage * resultsPerPage);

处决

var myPaginatedArray.slice(start, end);

用这个

$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;
}

我以前在 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 调用报告的总项计数。

希望能有所帮助

我认为这一个是完美的,并涵盖了所有的情况。

$offset = ($pageLimit * $page) - $pageLimit;

我想我应该添加以下内容来显示文本,例如:

查看 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计算上限可能有一个更简单的解决方案。

一个涵盖所有场景的简单分页方程将是:

$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,偏移量 = 0

Page = 2,偏移量 = 5

第3页,偏移量 = 10

当 < strong > page = 4时,偏移量 = 15 . . .

使用以下公式,这些工作很好:

  • 对于 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

当每个页面事件被触发时,以下是计算偏移量的标准和最简单的方法。

偏移量 = ((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)

设置偏移量的 PHP 代码。

$offset = ($page - 1) * $limit ;