计算分页的项目偏移量

时间:2010-08-19 10:50:13

标签: pagination

这似乎是非常简单的数学,但不知何故,我的大脑无法想到......

我正在尝试实现分页,并且需要计算项目偏移量以用于限制我的结果集。我在计算页面的第一项应具有的索引时遇到问题。

例如。

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,但这应该是语言无关的

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

11 个答案:

答案 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_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 

答案 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)