2010-05-13 11 views
2

Comment paginer une grande liste de fichiers dans un dossier?PHP Pagination du système de fichiers

Je ne vois aucune fonction dans la documentation PHP mentionnant un moyen de spécifier un 'offset'. Les deux glob() et scandir() retournent simplement tous les fichiers dans le dossier, et j'ai peur que ce ne soit pas une bonne idée pour un énorme répertoire.

Existe-t-il une meilleure façon de procéder que de parcourir tous les fichiers et de couper le premier nombre de fichiers X? Notez que je voudrais avoir des options pour la traversée récursive et en utilisant un motif glob().

Modifier: J'ai beaucoup regardé LimitIterator, GlobIterator et RecursiveDirectoryIterator. Ils ont tous l'air sympa mais je ne sais pas par où commencer même si je devais les combiner (La documentation de PHP SPL est extrêmement clairsemée). Je suis probablement en train de trop penser au problème.

+0

Quelle est la taille de la taille? Avez-vous essayé les classes SPL ou êtes-vous perplexe avec par où commencer? – salathe

+0

Actuellement, le dossier contient environ 2000 icônes. La pagination est donc nécessaire. J'ai essayé de travailler avec les Iterators SPL, mais la documentation est trop clairsemée. Ma version de PHP ne supporte pas GlobIterator, donc je pense que je vais devoir cuisiner ma propre version. Est-il préférable d'étendre l'un des itérateurs existants ou d'implémenter manuellement l'une des interfaces? –

+0

quelle version de PHP utilisez-vous? La cuisson d'un GlobIterator ne pose pas de problème si l'on se familiarise avec le fonctionnement de ces itérateurs (de filtrage). Si vous voulez faire des réflexions ici et là, n'hésitez pas, ou vous pouvez m'envoyer un email (suffixe @ php.net à mon nom d'utilisateur ici). – salathe

Répondre

2

Vous pouvez paginer les résultats vous-même, PHP retourne un tableau simple, de sorte que vous pouvez conserver les variables $ offset et $ limit pour savoir dans quelle partie de votre tableau vous êtes.

Si vous êtes dans un contexte Web, vous pouvez les transmettre dans les paramètres GET.

2

Juste pour mettre un peu de code à ce qu'a dit Francisco Soto, paginez manuellement

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

très rugueux, code non testé.

2

Non, il n'y en a pas. Les répertoires sont juste un autre type de cours d'eau, ce qui est la façon dont l'opérateur « chercher » est défini:

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

Vous voyez que c'est juste un retour rapide. Vous devez donc lire les n premières entrées pour lire l'entrée n + 1. Si vous voulez être plus efficace, vous pouvez lire le répertoire entier la première fois et l'utiliser comme cache (stocker par exemple dans la session). Une fois que vous avez tout lu, vous allez décaler n + 1 dans le tableau stocké.