PHP Файловая система Пагинация - PullRequest
2 голосов
/ 13 мая 2010

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

Я не вижу функций в документации PHP, в которых упоминается какой-либо способ задания смещения. И glob (), и scandir () просто возвращают все файлы в папке, и я боюсь, что это не будет хорошей идеей для огромного каталога.

Есть ли лучший способ сделать это, чем просто просмотреть все файлы и отрубить первое число X файлов? Обратите внимание, что я хотел бы иметь опции для рекурсивного обхода и использования шаблона glob ().

Редактировать: я много смотрел на LimitIterator , GlobIterator и RecursiveDirectoryIterator . Все они кажутся хорошими, но я понятия не имею, с чего начать, если бы мне пришлось их объединять (документация по PHP SPL крайне скудна). Я, наверное, просто обдумываю проблему.

Ответы [ 3 ]

2 голосов
/ 13 мая 2010

Просто чтобы добавить код к сказанному Франсиско Сото, разбивайте его на страницы вручную

$limit = 10;
$offset = (isset($_GET['offset'])) ? $_GET['offset'] : 0;
$dir = scandir($path);
for ($i = $offset; $i < $offset+$limit; $i++) {
    echo $dir[$i] . "<br />";
}
echo "<br />";
for ($i = 0; $i < count($dir); $i++) {
    echo "<a href='?offset=" . ($i*$limit) . "'>{$i}</a>";
}

ОЧЕНЬ грубый, непроверенный код.

2 голосов
/ 13 мая 2010

Нет, нет. Каталоги - это просто другой тип потоков, и вот как определяется оператор поиска:

static int php_plain_files_dirstream_rewind(php_stream *stream, off_t offset, int whence, off_t *newoffs TSRMLS_DC)
{
    rewinddir((DIR *)stream->abstract);
    return 0;
}

Вы видите, это просто перемотка. Таким образом, вы должны прочитать первые n записей, чтобы прочитать запись n + 1. Если вы хотите повысить эффективность, вы можете прочитать весь каталог в первый раз и использовать его в качестве кэша (например, хранить в сеансе). Прочитав все, вы переходите к смещению n + 1 в сохраненном массиве.

2 голосов
/ 13 мая 2010

Вы можете разбивать результаты на страницы самостоятельно, PHP возвращает простой массив, поэтому вы можете хранить переменные $ offset и $ limit, чтобы знать, в какой части вашего массива вы находитесь.

Если вы находитесь в веб-контексте, вы можете передать их в параметрах GET.

...