Универсальная пагинация (+/-)
/**
* Универсальная пагинация
*
* @param array $input Массив данных (список)
* @param int $length Количество строк на странице
* @param int $reverse Сортировка по возростанию / убыванию
*
* @return array Срез массива и порядковая нумерация страниц
*/
function pagination($input, $length, $reverse = 1) {
if (empty($input) or !is_array($input)) {
return false;
}
$page = (isset($_GET['page']) ? intval($_GET['page']) : 1);
$reverse ?: $input = array_reverse($input);
$numb = ceil(sizeof($input) / $length);
$offset = ($page * $length) - $length;
if ($page > $numb or $page < 1) {
$offset = 0;
$page = 1;
}
$pages = array_map(function ($i) use ($page, $numb, &$bufr) {
return $bufr = (
$i == 1 || $i == $numb || abs($i - $page) < 2
? ($i == $page ? "<b>$i</b>"
: " <a href='". basename(__FILE__) ."?page=$i'>$i</a> ")
: ($bufr == '...' || $bufr == '' ? '' : '...')
);
}, range(1, $numb));
$output['slice'] = array_slice($input, $offset, $length);
$output['pages'] = ($numb > 1 ? join($pages) : '');
return $output;
}Пример использования (+/-)
// Массив данных
$chars = ['А','Б','В','Г','Д','Е','Ж','З','И','К','Л','М'];
// Вывод по возростанию
$view = pagination($chars, 10);
// Или по убыванию
//$view = pagination($chars, 10, 0);
if ($view) {
// Постраничка сверху
echo $pagin = '<div style="background-color:#EEE5DE">'. $view['pages'] .'</div>';
foreach ($view['slice'] as $i => $v) {
// Вывод "зеброй" (для демонстрации)
echo ($i & 1 ? '<div style="background-color:#EEEEE0">'. $v .'</div>' : $v);
}
// Постраничка снизу
echo $pagin;
}