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.


Возможно, у вас есть лучшее решение, решающее такую же задачу? Если да, то было бы интересно взглянуть.
  • Вопрос задан
  • 4157 просмотров
Решения вопроса 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 страниц, тыкаешь на пятую страницу, если её нет, то тебя кидает на самую последнюю страницу, которая есть.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы