计算分页的项目偏移量

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_indexstart_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)

【讨论】:

是的,这就是公认的答案所说的

以上是关于计算分页的项目偏移量的主要内容,如果未能解决你的问题,请参考以下文章

在启用分页的情况下检测滚动视图中的 y 偏移量何时发生变化

Apollo 客户端中基于偏移量的分页错误

具有自定义数据源偏移量的 Android 分页库 RecyclerView 中的项目

Spring Pagination 中的偏移量计算

如何在 Codeigniter 分页中使用页码而不是偏移量?

动态计算偏移量