Wen Xiu (arrendek) wrote in ru_webmasters,
Wen Xiu
arrendek
ru_webmasters

  • Mood:
  • Music:

простой алгоритм разбивки содержания на страницы при помощи PHP

Проблема с которой часто сталкивается начинающий php-программист - разбивка большого количества содержимого (анекдотов, файлов представленных для скачки, картинок, продуктов в e-магазине, и т.д.) на странички. Сегодня мы разберём по косточкам простой алгоритм для её решения.

Итак, для простоты примера выведем список файлов в директории, по 10 файлов на страничку.

<?php
$source_directory
= "zip";
$display = 10;
$offset = (!empty($HTTP_GET_VARS['offset'])) ? $HTTP_GET_VARS['offset'] : 0;

$handle = opendir($source_directory);
while (
$file = readdir($handle))
{
     if((
$file != '.') && ($file != '..')) {
        
$files[] = $file;
     }
}
closedir($handle);
$pages = ceil(count($files)/$display);

if(
$offset < $pages)
{
    echo '<a href="'.$PHP_SELF.'?offset='.($offset+1).'">следующие '.$display.'</a>';
}
if(
$offset > 0)
{
    echo '<a href="'.$PHP_SELF.'?offset='.($offset-1).'">предыдущие '.$display.'</a>';
}
echo
'<hr>';
for(
$i = ($offset * $display); $i <= (($offset * $display) + $display); $i++)
{
    echo $files[$i];
}
?>

Теперь давайте посмотрим что здесь происходит построчно.

$source_directory = "zip";
$display = 10;

Здесь мы определяем директорию для считки и количество файлов на страничке для того чтобы это было можно легко поменять позже. Переменные этого рода всегда хорошо определять заранее, это делает код гораздо более универсальным и облегчает его использование позднее в других проектах.

$offset = (!empty($HTTP_GET_VARS['offset'])) ? $HTTP_GET_VARS['offset'] : 0;

Здесь мы используем ternary statement для того чтобы определить значение переменной offset (если она пуста, ей присваивается нулевое значение, иначе её значение остаётся тем же что и было). Эта переменная держит номер листа в списке на котором находимся.

$handle = opendir($source_directory);
while (
$file = readdir($handle))
{
     if((
$file != '.') && ($file != '..')) {
        
$files[] = $file;
     }
}

closedir($handle);

Открываем директорию для чтения и считываем все файлы в матрицу files для вычисления количества листов и для последующего показа имён файлов.

$pages = ceil(count($files)/$display);

Вычисляем количество страниц для показа линков на предыдущие и следующие страницы.

if($offset < $pages)
{
    echo '<a href="'.$PHP_SELF.'?offset='.($offset+1).'">следующие '.$display.'</a>';
}

Если мы не на последней странице, нужно показать линк на следующую страницу.

if($offset > 0)
{
    echo '<a href="'.$PHP_SELF.'?offset='.($offset-1).'">предыдущие '.$display.'</a>';
}

Соответственно, если мы не на первой странице, нужно показать линк на предыдущую страницу.

echo '<hr>';

Для красоты, отделим навигацию от списка горизонтальной линией.

for($i = ($offset * $display); $i <= (($offset * $display) + $display); $i++)
{
    echo
$files[$i];
}
;

Используя цикл for выводим список для нужной страницы.

Вот и всё.

Надеюсь, это даст вам что-то с чего начинать при написании своего собственного решения проблемы. Несомненно, это не самый эффективный вариант (к примеру, сейчас считка всех файлов из директории происходит при открытии каждого листа; более эффективным было-бы записать количество файлов в директории и количество листов в cookie или session).

Комментарии и поправки к коду горячо приветствуются, так-же как и вопросы и уточнения.

P.S.
© мой.

  • Post a new comment

    Error

    default userpic
  • 8 comments