2009-09-06 6 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

私が見つけている問題は、すべてを適切に並べ替えているようだが、数値キーは変わらないということだ。これは、たとえprint_rがすべてを正しい順序で印刷しても、元の順序でforeachを繰り返すように見えます。 – 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(); 
    } 

} 
関連する問題