views:

179

answers:

3

How does one paginate a large listing of files within a folder?

I can't see any functions in the PHP documentation that mention any way to specify an 'offset'. Both glob() and scandir() simply return all the files in the folder, and I'm afraid that won't be a good idea for a huge directory.

Is there any better way of doing this than simply going through all the files and chopping off the first X number of files? Note that I would like to have options for recursive traversal and using a glob() pattern.

Edit: I've looked a lot at LimitIterator, GlobIterator and RecursiveDirectoryIterator. They all seem nice but I have no idea where to even start if I was to combine them (The PHP SPL documentation is extremely sparse). I'm probably just over-thinking the problem.

+1  A: 

You can paginate the results yourself, PHP returns a simple array, so you can keep a $offset and $limit variables so you know in which part of your array you are.

If you are in a web context, you can pass these around in GET parameters.

Francisco Soto
A: 

Just to put some code to what Francisco Soto said, paginate manually

$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>";
}

VERY rough, untested code.

The.Anti.9
+1  A: 

No, there isn't. Directories are just another type of streams, and this is how the "seek" operator is defined:

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;
}

You see it's just a rewind. So you must read the first n entries to read entry n + 1. If you want to be more efficient, you can read the whole directory the first time and use it as a cache (store e.g. in the session). Once you've read all, you go to offset n+1 in the stored array.

Artefacto