Как разбить текстовый файл на страницы?

Как сделать, чтобы содержимое текстового файла (enter.txt) разбивалось на страницы (по 10 новостей)?

Ну подсчитать количество строк можно с помощью

echo sizeof (file ('enter.txt')); 

Вывести первые 10 новостей через `

$first = array_slice($lines, 0, 10);`

$news = implode('', $first);

А дальше как?


Ответы (1 шт):

Автор решения: phpBear

То, что такое решение не камильфо, и при больших размерах файлов все будет дико тормозить, и лучше бы все хранить в СУБД я оставлю за рамками так сказать... Какая задача, такое и решение...

/**
* Подсчет кол-ва строк в указанном файле
* @param string $fileName Имя файла
* @return integer
*/
function getFileLinesCount( $fileName ) {
    $result = 0;
    if ( trim( $fileName ) != '' && file_exists($fileName) ) {
        $fp = fopen($fileName, 'r'); //открываем файл на чтение
        if ($fp) {
            while ( !feof( $fp ) ) {
                $line = fgets($fp, 1024); //читаем файл по-строчно
                $result++; //увеличиваем счетчик строк
            }
            fclose($fp); //закрываем файл
        }
    }
    return $result;
}

/**
* Возвращает массив с указанным кол-вом строк из файла начиная с указанной строки
* @param string $fileName Имя файла
* @param integer $startLineNo Номер строки начиная с которой нужно вернуть нужное кол-во строк
* @param integer $linesCount Кол-во строк которое нужно вернуть
* @return array
*/
function getFileLines( $fileName, $startLineNo, $linesCount ) {
    $result = [];
    if ( trim( $fileName ) != '' && file_exists($fileName) && is_numeric( $startLineNo ) && intval( $startLineNo ) > 0 && is_numeric( $linesCount ) && intval( $linesCount ) > 0 ) {
        $fp = fopen($fileName, 'r');
        if ($fp) {
            $lCnt = 0;
            while ( !feof( $fp ) ) {
                $line = fgets($fp, 1024); //читаем файл по-строчно
                $lCnt++; //увеличиваем счетчик строк
                if ( $lCnt >= $startLineNo ) { //если номер прочитанной строки в файле равен или больше номера строки с которой нужно вернуть нужное кол-во строк
                    $result[] = $line; //запоминаем в выходной массив прочитанную строку
                }
                if ( count( $result ) >= $linesCount ) { //в массиве накопилось нужное кол-во строк?
                    break;
                }
            }
        }
    }
    return $result;
}

В index.php передаем два параметра page (номер страницы) и per_page (кол-во строк на страницу, можно его хранить внутри файла и не давать задавать пользователю). Пример: index.php?page=1&per_page=20

$page = (isset($_GET['page']) && is_numeric($_GET['page']) && intval($_GET['page']) >= 1 ? intval($_GET['page']) : 1); //если параметр на указан , по-умолчанию всегда 1-ая страница
$per_page = (isset($_GET['per_page']) && is_numeric($_GET['per_page']) && intval($_GET['per_page']) >= 1 ? intval($_GET['per_page']) : 20); //если парметр не указан по-умолчанию 20 строк на страницу
//Проверяем что номер страницы помноженный на кол-во строк на страницу не больше чем кол-во строк в файле
$linesCount = getFileLinesCount('news.txt');
if ( $page * $per_page <= $linesCount ) {
 $lines = getFileLines('news.txt', ($page-1)*$per_page, $per_page );
 //Выводим строки
 var_dump( $lines );

} else {
 //Ругаемся, что такого номера страницы не существует
}
→ Ссылка