2010-08-19 79 views
34

抵消这似乎是很简单的数学,但不知何故,我的大脑不能相信......计算项目的分页

我想实现分页和需要计算该项目抵消在限制我的结果集中使用。我在计算页面第一项应该具有的索引时遇到问题。

例如。

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但是这应该是独立于语言的

不知道这应该是在这道数学堆栈交换场地

回答

69

使用offset = (page - 1) * itemsPerPage + 1

+13

岂不是:偏移量=(页 - 1)* itemsPerPage 作为结果1号永远不会做出另外的说明? – 2010-08-19 10:56:04

+2

嗨你是否意味着抵消=(page_number - 1)* itemsPerPage; 如果这样不会产生大于itemsPerPage数字的数字? – Jam 2013-02-07 20:59:32

+0

我打算在考虑Jiew的例子的同时回答这个问题。他显然正在计算每个页面的第一个项目编号;所以firstItemForPage(1)=(1-1)·10 + 1 = 1,firstItemForPage(2)=(2-1)·10 + 1 = 11等等。 – Gumbo 2013-02-07 21:42:13

22

老实说要看。我不是PHP的人,但我会把两者都放在那里。如果你拉你的记录在某种形式的集合(list,阵列等),然后你的公式应该是:

offset = (page - 1) * itemsPerPage 

这是因为大多数(再次,我不是一个PHP的人)阵列和列表的第一个元素使用0。如果他们不为他们的第一个元素和/或你从一个表或别的东西,其中ID从1开始拉动使用0,那么就应该是:

offset = (page - 1) * itemsPerPage + 1 

我希望这是明确和帮助。

7
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' 
1

使用JS作为一个例子,渐进的Web应用程序的人...

JS数组中有原型法.slice(start, end)overview here它需要开始索引和结束索引作为参数。

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

开始指数

var start = parseInt((selectedPage - 1) * resultsPerPage); 

末指数

var end = parseInt(selectedPage * resultsPerPage); 

执行

var myPaginatedArray.slice(start, end); 
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; 
}