PHP « Постраничный вывод новостей из файла

Имеются новости, записанные в файл (1 строка = 1 новость). Новости выводятся по 5 штук на 1 странице. Страница имеет адрес вида page.php?num=1 где num возрастанию - это новости свежее, а по убыванию - старее. Допустим, узнаём общее количество строк в файле ($size) и текущий num ($num). Необходимо в переменные $b и $f записать номера строк "от" и "до", которые нужно считывать при текущем num (например: $b=15, $f=10 - дальше скрипт будет считывать с 15 по 10 строку).

1 ответов


В общем, решил свой вопрос так, причём всё работает идеально, проверено с разным количеством строк в файле:


$b_add=$size-5*(floor($size/5));
if($b_add==0)$b_add=5;
$b=($num-1)*5+$b_add;
 

Наверняка не самый лучший способ достичь требуемый вам результат, зато, на мой взгляд, наглядный


$num = 1;
$limit = 5;
$news = file('news.txt');
$cnt = count($news);
$start = $cnt-($num-1)*$limit-1;
if ($start < 0) {
    $start = $cnt-1;
    // либо die('404');
}
$end = $start-$limit;
for ($i=$start;$i>=0&&$i>$end;$i--) {
    echo $news[$i]."
\n"
;
}
 
Вы также можете использовать array_reverse применительно к $news, тогда проход по массиву будет прямым

  1. нужно построить индекс, т.е. файл в котором будет хранится информация о том, с какой позиции начинается каждая строка и какой она длины.
  2. индекс нужно строить только после изменения файла, т.е. название файла индекса можно именовать с помощью времени изменения файла новостей, напрмер "news.txt.index.123456789132", где 123456789132 - формат времени unix timestamp c микросекундами. Перед чтением индекса генерируем нужное имя файла -индекса, проверяем его существование, если нет - то строим, если есть - то читаем из него
  3. при загрузке страницы читать индексный файл (он намного меньше, чем файл с новостями) и по полученной информации читать из файла новостей с нужной позиции нужное кол-во символов
  4. прочитав все это уже выводить...


допустим есть файл новостей:

1. новость 1
2. новость 2
3. суперновость 4
...
54. новость номер 54
 

индексный файл будет выглядеть примерно так:

0:0:12;1:13:12;2:26:18
 
где информация о каждой строке разделена ";", информация имеет слуд. формат:

<номер строки>:<начальная позиция>:<длина строки>
 
0:0:12 - строка с номером 0 (первая строка) находится в файле начиная с символа 0 и ее длина 12 символов
1:13:12 - строка с номером 1 (вторая строка) находится в файле начиная с символа 13 и ее длина 12 символов
2:26:18 - строка с номером 2 (третьястрока) находится в файле начиная с символа 26 и ее длина 18 символов

ходить по файлу в php: fseek

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