【问题标题】:How do I calculate the offsets for pagination?如何计算分页的偏移量?
【发布时间】:2015-03-15 13:21:54
【问题描述】:

我正在编写我正在编写的 Web 服务中的分页功能,但我缺乏数学洞察力现在正在扼杀我。 我有几个键:totalItemscurrentItemscurrentPagetotalPages,还有几个指向 firstlastpreviousnext 的链接。

此时,我正在做以下计算:

  • totalItems: 表格行数
  • currentItems: limit 来自 HTTP 请求的参数
  • currentPagestart参数除以limit参数
  • totalPages:表中的行数除以limit。 (四舍五入,8.1 页 = 9 页)

我认为这些计算是正确的,我正在努力解决的问题如下:

  • firststart 参数为 1,limit 来自 HTTP 请求
  • last: 应该是最后一页的第一项,如何正确计算?
  • previous: 应该是上一页的第一项,怎么办?
  • next: 应该是下一页的第一项,怎么办?

我想问的是:我的计算是否正确?以及如何解决lastpreviousnext 的三个问题?

【问题讨论】:

  • 如何控制分页? U 传递查询字符串或页码中的偏移量?
  • HTTP中的查询字符串是这样的: api?start=x&limit=y 所以开始如果是偏移的item数,limit是每页的item数。
  • 然后查看答案,但使用 api?page=X 会更容易
  • @DarkBee 我同意它更容易,不幸的是,我不能在这个项目中使用它。
  • @DarkBee 该问题与查询字符串无关。这是关于计算偏移量。

标签: php pagination


【解决方案1】:

如果你使用 mysql 它的

LIMIT offset, items_per_page

要计算你可以使用的偏移量

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

然后相应地替换$page

最后

$last_offset = ($totalPages - 1) * $items_per_page;

上一个

$previous_offset = (($currentPage - 1) - 1) * $items_per_page;

下一个

$next_offset = (($currentPage + 1) - 1) * $items_per_page;

编辑:

if ($previous_offset > 0) echo '<a href="?start='.$previous_offset.'&limit='.$items_per_page.'>prev</a>';


if ($next_offset <= $totalPages * $items_per_page) echo '<a href="?start='.$next_offset.'&limit='.$items_per_page.'">prev</a>';

【讨论】:

  • 所以,如果我是正确的,我会创建一个指向最后一页的 HTTP 链接,如下所示:api?start=($totalPages-1)*limit&limit=limit?我的想法是对的吗?
  • 是的,如果你在查询字符串中使用 start 和 limit :)
  • 我将立即对此进行测试,无论成功与否我都会发布更新!
  • start = 1 和 limit = 2,我得到负偏移量,这听起来不对?
  • 你需要检查你是否确实需要显示上一个和下一个链接。
【解决方案2】:

我浏览了很多文章并创建了非常简单的分页公式

offset = (limit * page no) - limit

例如,如果限制是 5

LIMIT 5
    page 1 
        offset : no (No need to use offset)
        (5 - 1) - 5
         select * from users limit 5

    page 2
        offset : 5
        (5 * 2) - 5
        select * from users limit 5 offset 5

    page 3 
        offset 10
        (5 * 3) - 5
        select * from users limit 5 offset 10

    page 4 
        offset 15
        (5 * 4) - 5
        select * from users limit 5 offset 15

select * from table name limit 5 offset value(根据公式计算)

这对我有用

【讨论】:

  • (5 * 1) - 5 而不是 (5 - 1) - 5 对吧?
  • 我们不需要偏移量,当我们在寻找第1页的记录时,只需限制就足够了
【解决方案3】:

如果 limit 您指的是每页的项目数,那么:

currentItems: same as limit
currentPage: floor(start / limit)
totalPages: ceil(totalItems / limit)
last: totalPages * limit
previous: (currentPage-1) * limit // Should be greater or equal to 0
next: (currentPage+1) * limit // Should be less or equal than totalPages

这只是一个近似值...

【讨论】:

  • 如何以 0 开始计算
【解决方案4】:

在这里,我使用了下面的代码并且工作正常。

<?php
//curpage = current page;
//-1 = for adjust actual page;
//30 = total post for each page;
//5 = jump or offset determided for start count post 
?>

<?php $offset = (($curpage - 1) * 30) + 5 ;?>
<!-- print for view test -->
<h1><?php echo $offset ?></h1>
<?php
    $args_2 = array(
      'offset' => $offset,
      'post_type' => 'post',
      'posts_per_page' => 30,
      'category_name'     => $cat_filter,
      'post_status' => 'publish',
      'paged' => $paged
    );

  $query = new WP_Query( $args_2 );

  if ( $query->have_posts() ) :
    while ( $query->have_posts() ) : $query->the_post();
      ?>

【讨论】:

    猜你喜欢
    • 2013-08-24
    • 2021-10-14
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多