【问题标题】: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 但这应该是独立于语言的

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

【问题讨论】:

    标签: pagination


    【解决方案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)

                  【讨论】:

                  • 是的,这就是公认的答案所说的
                  猜你喜欢
                  • 2013-08-24
                  • 2021-10-14
                  • 2015-03-15
                  • 2018-10-16
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-04-13
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多