Задать вопрос
DeusModus
@DeusModus

Алгоритм подсчёта количества страниц(может вы предложите лучше)

Копался в одной системе и немного ошалел от количества кода, которое там занимается подсчётом количества страниц(что-то вроде пагинации). Тонны переменных, проверок.
Подумал, что же тут такого сложного и написал свою реализацию:
  1. <?php
  2. /**
  3. * Описание алгоритма:
  4. * Алгоритм печатает количество страниц, основываясь на трех константах:
  5. * 1. Количество элементов(всего)
  6. * 2. Желаемое количество элементов на страницу
  7. * 3. Максимальное количество дополнений(ситуация, когда на последней странице 1-2 элемента)
  8. */
  9. define('RESULTS_COUNT', 12349);
  10. define('RESULTS_PER_PAGE', 17);
  11. define('MAX_ADDITIONS', 7);
  12.  
  13. $results_per_page = RESULTS_PER_PAGE>0?RESULTS_PER_PAGE:1; // дополнительная проверка на division by zero
  14.  
  15. if(RESULTS_COUNT<$results_per_page || RESULTS_COUNT==$results_per_page){
  16.   exit('1 page for '.RESULTS_COUNT.' results.');
  17. }
  18.  
  19. $exact_pages_count = RESULTS_COUNT / $results_per_page;
  20. if (is_int($exact_pages_count)) {
  21.   exit($exact_pages_count.' pages for '.RESULTS_COUNT.' results.');
  22. }
  23. else {
  24.   $rough_estimate_pages = intval($exact_pages_count);
  25.   $number_of_surplus=RESULTS_COUNT-($results_per_page*$rough_estimate_pages);
  26.   $pages_of_surplus=$number_of_surplus<=MAX_ADDITIONS?$rough_estimate_pages:$rough_estimate_pages++;
  27.   exit($rough_estimate_pages.' pages for '.RESULTS_COUNT.' results.');
  28. }
  29. ?>
* This source code was highlighted with Source Code Highlighter.


Возможно, у вас есть лучшее решение, решающее такую же задачу? Если да, то было бы интересно взглянуть.
  • Вопрос задан
  • 4328 просмотров
Подписаться 4 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
@niko83
% — остаток от деления
floor() — округлить в меньшую сторону

$countPages = floor(RESULTS_COUNT/RESULTS_PER_PAGE);

if (RESULTS_COUNT%RESULTS_PER_PAGE >= MAX_ADDITIONS){
$countPages++;
};

return $countPages;
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
Cheese
@Cheese
что-то непонятно, вам надо посчитать сколько страниц займёт полученное количество результатов при заданном количестве элементов на страницу?
Ответ написан
if(RESULTS_COUNT<$results_per_page || RESULTS_COUNT==$results_per_page)


O_o

Есть оператор сравнения <=
Ответ написан
Kalantyr
@Kalantyr
О, как раз позавчера нужно было решить эту задачу для Silverlight-приложения (язык C#). Вот что вышло:

public static IDictionary<int, IEnumerable> DivideItems(IEnumerable sourceItems, int itemsAtPage)
{
var result = new Dictionary<int, IEnumerable>();
var array = sourceItems.ToArray();
var j = 0;
var pageNumber = 1;
while (j < array.Length)
{
var ar = new T[Math.Min(itemsAtPage, array.Length - j)];
for (var i = 0; i < ar.Length; i++)
ar[i] = array[j + i];
j += ar.Length;
result.Add(pageNumber, ar);
pageNumber++;
}
return result;
}


Это Generic-метод, T - любой тип. Функция принимает коллекцию объектов и максимальное число объектов на странице. Возвращает пары <[номер страницы] : [коллекция объектов страницы]>

Похоже, <code/> не совсем точно показывает обобщенные типы, так что вот на всякий случай скриншот:
Ответ написан
OlegTar
@OlegTar
программист .NET, Javascript, Perl
DeusModus

Алгоритм Cheese как раз и решает поставленную задачу. Cheese ведь использует ceil — нахождение наименьшего целого, которое больше полученного числа.
Ответ написан
OlegTar
@OlegTar
программист .NET, Javascript, Perl
Автор, может в этой системе количество записей изначально не считается, для ускорения.

К примеру, выводится сначала 5 страниц, тыкаешь на пятую страницу, если её нет, то тебя кидает на самую последнюю страницу, которая есть.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽