2009-09-06 117 views
8

我正在編寫一個目錄,列出lighttpd的PHP5腳本。在給定的目錄中,我希望能夠列出直接的子目錄和文件(帶有信息)。使用DirectoryIterator對文件進行排序

快速搜索後,DirectoryIterator似乎是我的朋友:

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

,但我希望能夠通過文件名,日期,MIME類型文件進行排序...等

如何做到這一點(與ArrayObject/ArrayIterator?)?

感謝

+1

優秀的問題,只是我在找什麼。 –

回答

2

菲利普W.張貼在這裏一個很好的例子: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

我發現這個問題是它似乎排序正確,但數字鍵保持不變。這似乎使foreach以原始順序迭代,即使print_r以正確的順序打印所有內容。 – enobrev

+0

* foreach *總是遵循數組的順序,它不會按數字鍵排序。 – AndreKR

+0

將上面的代碼從** uasort()**更改爲** usort()**以重置密鑰。 – ryanwinchester

4

上述解決方案並沒有爲我工作。這是我的建議:

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

} 
相關問題