2009-09-06 14 views
8

Sto creando una directory che elenca lo script PHP5 per lighttpd. In una determinata directory, mi piacerebbe essere in grado di elencare sottodirectory e file diretti (con informazioni).Ordinamento di file con DirectoryIterator

Dopo una rapida ricerca, DirectoryIterator sembra essere il mio amico:

foreach (new DirectoryIterator('.') as $file) 
{ 
    echo $file->getFilename() . '<br />'; 
} 

ma mi piacerebbe essere in grado di ordinare i file per nome, data, mime-type ... ecc

Come fare questo (con ArrayObject/ArrayIterator?)?

Grazie

+1

ottima domanda, proprio quello che stavo cercando. –

risposta

2

Philipp W. registrato un buon esempio: http://php.oregonstate.edu/manual/en/directoryiterator.isfile.php

function cmpSPLFileInfo($splFileInfo1, $splFileInfo2) 
{ 
    return strcmp($splFileInfo1->getFileName(), $splFileInfo2->getFileName()); 
} 

class DirList extends RecursiveDirectoryIterator 
{ 
    private $dirArray; 

    public function __construct($p) 
    { 
     parent::__construct($p); 
     $this->dirArray = new ArrayObject(); 
     foreach($this as $item) 
     { 
      $this->dirArray->append($item); 
     } 
     $this->dirArray->uasort("cmpSPLFileInfo"); 
    } 

    public function getIterator() 
    { 
     return $this->dirArray->getIterator(); 
    } 

} 
+1

Il problema che sto riscontrando è che sembra ordinare tutto correttamente, ma i tasti numerici rimangono gli stessi. Ciò sembra rendere un iterare ripetuto nell'ordine originale, anche se un print_r stampa tutto nell'ordine corretto. – enobrev

+0

* foreach * segue sempre l'ordine dell'array, non ordina per chiavi numeriche. – AndreKR

+0

cambia il codice sopra da ** uasort() ** a ** usort() ** per reimpostare le chiavi. – ryanwinchester

4

Sopra soluzione non ha funzionato per me. Ecco cosa suggerisco:

class SortableDirectoryIterator implements IteratorAggregate 
{ 

    private $_storage; 

    public function __construct($path) 
    { 
    $this->_storage = new ArrayObject(); 

    $files = new DirectoryIterator($path); 
    foreach ($files as $file) { 
     $this->_storage->offsetSet($file->getFilename(), $file->getFileInfo()); 
    } 
    $this->_storage->uksort(
     function ($a, $b) { 
      return strcmp($a, $b); 
     } 
    ); 
    } 

    public function getIterator() 
    { 
    return $this->_storage->getIterator(); 
    } 

} 
Problemi correlati