2010-05-13 5 views
2

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

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

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

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

+0

Какой размер большой? Вы вообще пробовали классы SPL, или вы не в курсе, с чего начать? – salathe

+0

В настоящее время папка имеет около 2000 значков, поэтому необходимо разбиение на страницы. Я пробовал работать с Итераторами SPL, но документация слишком скудна. Моя версия PHP также не поддерживает GlobIterator, поэтому я думаю, что мне придется готовить свою собственную версию. Лучше ли продлить один из существующих итераторов или вручную реализовать один из интерфейсов? –

+0

, какую версию PHP вы используете? Приготовление GlobIterator не вызывает особых затруднений при знакомстве с тем, как работают эти итераторы (фильтрация). Если вы хотите отбросить мысли туда и обратно, не стесняйтесь, или вы можете написать мне (суффикс @ php.net для моего имени пользователя здесь). – salathe

ответ

2

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

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

2

Просто поставить код на то, что сказал Франциско Soto, постраничной вручную

$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

Нет, нет. Каталоги просто еще один тип потоков, и это, как определяется оператор «искать»:

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 в сохраненном массиве.

Смежные вопросы