Просмотр поста

.
ДоХтор
Универсальная пагинация (+/-)
/**
* Универсальная пагинация
* 
* @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;
}