[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Можно ли проще и/или короче?
Страницы: 1, 2
volter9
Привет всем!

Есть данный код:
/**
* Clamp a number $x between $min and $max
*
*
@param int $x
*
@param int $min
*
@param int $max
*
@return int
*/

function clamp ($x, $min, $max) {
return $x < $min ? $min : ($x > $max ? $max : $x);
}

/**
* Create a limited sequence
*
*
@param int $center
*
@param int $limit
*
@param int $min
*
@param int $max
*
@return int
*/

function limited_range ($center, $limit, $min, $max) {
$range = array();
$half = (int)($limit / 2);

$start = $center - $half;
$end = $center + $half;

for ($i = $start; $i < $end; $i ++) {
$i >= $min && $i <= $max and $range[] = $i;
}

!in_array($min, $range) and array_unshift($range, $min);
!
in_array($max, $range) and array_push($range, $max);

return $range;
}

/**
* Generates pagination array
*
*
@param int $total - Total of rows/items
*
@param int $ipp - Items Per Page
*
@param int $page - Page
*
@return array
*/

function pagination_generate ($total, $ipp, $page) {
$offset = $total > $ipp ? ($page - 1) * $ipp : 0;

$pages = ceil($total / $ipp);
$page = clamp($page, 1, $pages);

$pagination = $pages > 1 ? limited_range($page, clamp($pages, 1, 9), 1, $pages) : array();

$limit = (int)($ipp - ($offset % $ipp));

return compact('limit', 'offset', 'pages', 'page', 'pagination');
}


Дело он свое делает, но мне интересно, можно ли его как нибудь упростить и/или укоротить?

Раньше он выглядел так:
Много кода
/**
* Generates pagination array
*
*
@param int $total - Total of rows/items
*
@param int $ipp - Items Per Page
*
@param int $page - Page
*
@return array
*/

function pagination_generate ($total, $ipp, $page) {
$result = [];
$offset = 0;
$pages = ceil($total / $ipp);
$pagination = [];

if ($page >= $pages) {
$page = $pages;
}

if ($total > $ipp) {
$offset = ($page - 1) * $ipp;
}

if ($pages > 1) {
for ($i = 0, $c = ($pages > 9) ? 9 : $pages; $i < $c; $i++) {
if ($pages <= $c) {
$pagination[] = $i + 1;
}
else {
if ($i === 0) {
$pagination[$i] = 1;
}
else if ($i === $c - 1) {
$pagination[$i] = $pages;
}
else {
$cell = $page - ceil(($c - 1) / 2) + $i;

if ($cell > $pages - 1 || $cell < 2) {
continue;
}

$pagination[] = $cell;
}
}
}
}


$result['limit'] = (int)($ipp - ($offset % $ipp));
$result['offset'] = (int)$offset;
$result['pages'] = (int)$pages;
$result['page'] = (int)$page;
$result['pagination'] = $pagination;

return $result;
}

Но меня старый вариант не устраивает.

UPD: Забыл про пример, точнее, работу функции:
// Создать пагинацию для 20 страниц
// Пагинация на 10-ой странице

$pagination = pagination_generate(100, 5, 10);

foreach ($pagination['pagination'] as $page) {
echo "<a href=\"/blogs/tech/page/$page\">$page</a> \n";
}


_____________
Мой блог
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.