PHP « Постраничный вывод новостей из файла
Имеются новости, записанные в файл (1 строка = 1 новость). Новости выводятся по 5 штук на 1 странице. Страница имеет адрес вида page.php?num=1 где num возрастанию - это новости свежее, а по убыванию - старее. Допустим, узнаём общее количество строк в файле ($size) и текущий num ($num). Необходимо в переменные $b и $f записать номера строк "от" и "до", которые нужно считывать при текущем num (например: $b=15, $f=10 - дальше скрипт будет считывать с 15 по 10 строку).
1 ответов
В общем, решил свой вопрос так, причём всё работает идеально, проверено с разным количеством строк в файле:
Наверняка не самый лучший способ достичь требуемый вам результат, зато, на мой взгляд, наглядный
$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, тогда проход по массиву будет прямым
- нужно построить индекс, т.е. файл в котором будет хранится информация о том, с какой позиции начинается каждая строка и какой она длины.
- индекс нужно строить только после изменения файла, т.е. название файла индекса можно именовать с помощью времени изменения файла новостей, напрмер "news.txt.index.123456789132", где 123456789132 - формат времени unix timestamp c микросекундами. Перед чтением индекса генерируем нужное имя файла -индекса, проверяем его существование, если нет - то строим, если есть - то читаем из него
- при загрузке страницы читать индексный файл (он намного меньше, чем файл с новостями) и по полученной информации читать из файла новостей с нужной позиции нужное кол-во символов
- прочитав все это уже выводить...
допустим есть файл новостей:
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
еще думаю стоит учитывать символы конца строки и перевода каретки...
но а в общем вот такая вот идея