Pagination 计算分页的项目偏移量

Pagination 计算分页的项目偏移量,pagination,Pagination,这似乎是非常简单的数学,但不知怎么的,我的大脑无法思考 我正在尝试实现分页,需要计算用于限制结果集的项偏移量。我在计算页面的第一项应该有什么索引时遇到问题 例如 我想到 offset = page * itemsPerPage + 1 但第1页的情况并非如此。这一定有个公式吧?我使用PHP/Zend_Paginator/Doctrine2,但这应该是独立于语言的 不知道这是否应该在数学堆栈交换站点中使用offset=(第1页)*itemsPerPage+1。我不是PHP的人,但我会把两者都放在

这似乎是非常简单的数学,但不知怎么的,我的大脑无法思考

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

例如

我想到

offset = page * itemsPerPage + 1
但第1页的情况并非如此。这一定有个公式吧?我使用PHP/Zend_Paginator/Doctrine2,但这应该是独立于语言的


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

使用
offset=(第1页)*itemsPerPage+1
。我不是PHP的人,但我会把两者都放在那里。如果将记录拉入某种形式的集合(列表、数组等),则公式应为:

offset = (page - 1) * itemsPerPage
offset = (page - 1) * itemsPerPage + 1
这是因为大多数(同样,我不是PHP人士)数组和列表的第一个元素使用0。如果他们不使用0作为第一个元素,并且/或者您正在从ID从1开始的表或其他地方提取,那么它应该是:

offset = (page - 1) * itemsPerPage
offset = (page - 1) * itemsPerPage + 1
我希望这是清楚的并且有帮助。

start=(第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'
结束=项目总数 如果(itemsPerPage总计项目){ 结束=项目总数; } } //例如,“193项中的21-30项” “+totalItems+”项目中的“开始+”-“+end+”
以JS为例,针对渐进式web应用程序用户

JS数组有一个原型方法
.slice(start,end)
,它将开始索引和结束索引作为参数

我发现计算这两个索引的最简单方法如下:

开始索引

var start =  parseInt((selectedPage - 1) * resultsPerPage);
var end = parseInt(selectedPage * resultsPerPage);
结束索引

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;
}
$row\u page=5//每页项目数
如果(isset($\u GET['p'])){
$page_num=$\u GET['p'];
}否则{
$page_num=0;
}
$offset=($page\u num)*$row\u page;
$cn=31;
$pg=(int)ceil($cn/$row_页);

对于($i=1;$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>

{{totalItemsDownloaded}的{(当前页-1)*itemsPerPage+(i+1)}项
{{item.name}
单击“上一步”和“下一步”按钮后,我的当前页面总是很方便,但初始化为1,
itemsPerPage
作为应用程序设置,
totalitemsdownload
是WebAPI调用报告的项目总数


我希望它能有所帮助

我认为这本书非常完美,涵盖了所有场景

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

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

查看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。

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

$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 . .
.

使用以下公式,这些公式效果良好:

  • 对于
    开始索引
    (页码-1)*每页
  • 对于
    end\u index
    start\u index+(每页-1)
    (通常我们在SQL中只指定
    每页-1

如果不是:offset=(第-1页)*itemsPerPage作为结果编号1将永远不会显示。您好,您的意思是offset=(第1页)*itemsPerPage;如果是这样,结果不会生成大于itemsPerPage的数字吗?我想回答这个问题,同时考虑到Jiew的例子。他显然试图计算每页的第一个项目编号;因此firstItemForPage(1)=(1-1)·10+1=1,firstItemForPage(2)=(2-1)·10+1=11,依此类推。
$offset=($pageLimit*$page)-$pageLimit;
我已经用了一年多了。你也可以试试。“通常”每个人都用0作为起点,无论是PHP、javascript等。乘法的大括号可以省略