2010-08-19 3 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 В результате число-никогда не будет показанной иначе? –

+2

Привет, вы имеете в виду offset = (page_number - 1) * itemsPerPage; Если так результат не будет генерировать числа, превышающие номер itemsPerPage? – Jam

+0

Я хотел ответить на вопрос, принимая во внимание пример Jiew.Он, очевидно, пытается вычислить первый номер позиции для каждой страницы; поэтому firstItemForPage (1) = (1-1) · 10 + 1 = 1, firstItemForPage (2) = (2-1) · 10 + 1 = 11 и т. д. – Gumbo

22

Честно говоря, очень важно. Я не человек PHP, но я поставил оба там. Если вы тянете свои записи в той или иной форме сбора (список, массив и т.д.), то ваша формула должна быть:

offset = (page - 1) * itemsPerPage 

Это происходит потому, что большинство (опять же, я не PHP человек) и массивы списки используют 0 для своего первого элемента. Если они не используют 0 для первого элемента и/или вы потянув из таблицы или что-то еще, где идентификаторы начинаются с 1, то он должен быть:

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 в качестве примера, для прогрессивных веб-приложений людей ...

JS массивы имеют метод прототипа .slice(start, end)overview here он принимает индекс начального и конечный индекс в качестве аргументов.

Я нашел самый простой способ подсчитать оба индекса следующим образом:

Start Index

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

Index End

var end = parseInt(selectedPage * resultsPerPage); 

Execution

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; 
} 
Смежные вопросы