2009-09-06 122 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(); 
    } 

} 
相关问题