2009-09-06 11 views
8

Robię katalog zawierający skrypt PHP5 dla lighttpd. W danym katalogu chciałbym mieć możliwość wyświetlania bezpośrednich podkatalogów i plików (z informacjami).Sortowanie plików za pomocą DirectoryIterator

Po szybkim wyszukiwaniu, DirectoryIterator wydaje się być moim przyjacielem:

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

ale chciałabym móc sortować pliki według nazwy pliku, data, mim typów ... itd

Jak to zrobić (z ArrayObject/ArrayIterator?)?

Dzięki

+1

doskonałe pytanie, właśnie tego szukałem. –

Odpowiedz

2

Philipp W. napisali dobry przykład tutaj: 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

Problem, który znajduję w tym przypadku, polega na tym, że wydaje się, że wszystko poprawnie sortuje, ale klucze numeryczne pozostają takie same. Wydaje się, że foreach iteruje w oryginalnej kolejności, nawet jeśli print_r drukuje wszystko we właściwej kolejności. – enobrev

+0

* foreach * zawsze podąża za porządkiem tablicy, nie sortuje według kluczy numerycznych. – AndreKR

+0

zmień powyższy kod z ** uasort() ** na ** usort() **, aby zresetować klucze. – ryanwinchester

4

Przede rozwiązanie nie działa dla mnie. Oto, co proponuję:

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

}