2009-09-06 3 views
8

Ich mache ein Verzeichnis, PHP5-Skript für Lighttpd auflisten. In einem bestimmten Verzeichnis möchte ich direkte Unterverzeichnisse und Dateien (mit Informationen) auflisten können.Sortieren von Dateien mit DirectoryIterator

Nach kurzer Suche, scheint DirectoryIterator mein Freund zu sein:

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

aber ich mag Dateien sortieren nach Dateinamen zu können, Datum, Mime-Typen ... etc

Wie geht das (mit ArrayObject/ArrayIterator?)?

Dank

+1

ausgezeichnete Frage, genau das, was ich gesucht habe. –

Antwort

2

Philipp W. geschrieben hier ein gutes Beispiel: 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

Das Problem, das ich damit finde, ist, dass es scheint alles richtig zu sortieren, aber die numerischen Tasten bleiben gleich. Dies scheint zu einer Wiederholung in der ursprünglichen Reihenfolge zu führen, auch wenn print_r alles in der richtigen Reihenfolge druckt. – enobrev

+0

* foreach * folgt immer der Reihenfolge des Arrays, es wird nicht nach numerischen Schlüsseln sortiert. – AndreKR

+0

Ändern Sie den obigen Code von ** uasort() ** in ** usort() **, um die Schlüssel zurückzusetzen. – ryanwinchester

4

Above Lösung nicht für mich arbeiten. Hier ist, was ich vorschlage:

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

}