Как рассчитать смещения для разбивки на страницы?

Я работаю над функцией разбивки на страницы в веб-сервисе, который я пишу, но мое отсутствие математического понимания сейчас убивает меня. У меня есть пара ключей: totalItems , totalItems , totalItems , totalPages , но также несколько ссылок на first , last , previous и next .

В этот момент я делаю следующие вычисления:

  • totalItems : количество строк в таблице
  • currentItems : параметр limit из HTTP-запроса
  • currentPage : start параметр, деленный на limit параметр
  • totalPages : количество строк в таблице, деленное на limit . (Округленное вверх, 8.1 страница = 9 страниц)

Я предполагаю, что эти вычисления правильные, с чем я борюсь, является следующее:

  • first : start параметр равен 1 с limit от HTTP-запроса
  • last : должен быть первый элемент последней страницы, как я могу рассчитать это правильно?
  • previous : должен быть первый элемент предыдущей страницы, как мне это сделать?
  • next : должен быть первый элемент следующей страницы, как мне это сделать?

Я бы хотел спросить: правильно ли мои вычисления? И как мне решить три проблемы с last , previous и next ?

Если вы работаете с mysql

 LIMIT offset, items_per_page 

Для расчета смещения u можете использовать

 $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>'; 

Если для ограничения вы ссылаетесь на количество элементов на странице, то:

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

Я просто приблизился …