2010-08-19 81 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; 
}