2010-05-28 49 views
13

我使用RecursiveDirectoryIteratorRecursiveIteratorIterator使用下面的代码构建文件列表树。我需要对列表进行排序 - 然后将目录按字母顺序排列或按字母顺序排列。使用RecursiveDirectoryIterator排序目录列表​​

谁能告诉我如何排序文件列表?

$dir_iterator = new RecursiveDirectoryIterator($groupDirectory); 
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST); 
foreach ($iterator as $file) { 
    // do stuff with $file 
} 
+0

[在PHP中使用$ files = new DirectoryIterator()之后可能的重复,如何对项目进行排序?](http://stackoverflow.com/questions/1076881/after-using-files-new-directoryiterator-in- php-how-do-you-sort-the-items) – 2010-05-28 15:49:30

+0

[salathe/spl-examples - Sorting Iterators](https://github.com/salathe/spl-examples/wiki/Sorting-Iterators) – hakre 2012-11-25 17:24:15

回答

1

这是不可能使用Iterator本身。我看到在SO上的某个地方对Iterator类进行了扩展,但这个类可以排序,但是记得很惭愧地遇到了麻烦。

也许this question帮助的答案,尽管他们指出了迭代器?

更新Here是一个愚蠢到你的问题与一些答案 - 承认并不多,但!

+0

Dang。我认为这些迭代器真的会帮助我。谢谢Pekka。 – 2010-05-28 16:06:26

23

有多种选项可用,您可以使用这些选项以某种方式对迭代器进行排序。最好的选择将取决于你想要如何操作迭代器的内容,你想从迭代器中得到什么,以及你真正想要/需要的迭代器有多少。

方法会有所不同;使用类似SplHeap(或Min,Max变种),SplPriorityQueue(可能用于文件大小等),或者只是将迭代器封装到可以对其内容进行排序的类似ArrayObject之类的类中。

我将以SplHeap为例。既然要安排RecursiveDirectoryIterator的全部内容按字母顺序排列,然后像下面这样可以用于:

class ExampleSortedIterator extends SplHeap 
{ 
    public function __construct(Iterator $iterator) 
    { 
     foreach ($iterator as $item) { 
      $this->insert($item); 
     } 
    } 
    public function compare($b,$a) 
    { 
     return strcmp($a->getRealpath(), $b->getRealpath()); 
    } 
} 

$dit = new RecursiveDirectoryIterator("./path/to/files"); 
$rit = new RecursiveIteratorIterator($dit); 
$sit = new ExampleSortedIterator($rit); 
foreach ($sit as $file) { 
    echo $file->getPathname() . PHP_EOL; 
} 

的排序顺序是按字母顺序排列,混合文件和文件夹:

./apple 
./apple/alpha.txt 
./apple/bravo.txt 
./apple/charlie.txt 
./artichoke.txt 
./banana 
./banana/aardvark.txt 
./banana/bat.txt 
./banana/cat.txt 
./beans.txt 
./carrot.txt 
./cherry 
./cherry/amy.txt 
./cherry/brian.txt 
./cherry/charlie.txt 
./damson 
./damson/xray.txt 
./damson/yacht.txt 
./damson/zebra.txt 
./duck.txt 
+0

非常感谢你! – eisberg 2011-04-18 20:23:17

0

Sönke Ruempler有很大的解决方案:

class SortingIterator implements IteratorAggregate 
{ 

     private $iterator = null; 

     public function __construct(Traversable $iterator, $callback) 
     { 
       if (!is_callable($callback)) { 
         throw new InvalidArgumentException('Given callback is not callable!'); 
       } 

       $array = iterator_to_array($iterator); 
       usort($array, $callback); 
       $this->iterator = new ArrayIterator($array); 
     } 


     public function getIterator() 
     { 
       return $this->iterator; 
     } 
} 

来源:http://www.ruempler.eu/2008/08/09/php-sortingiterator

+2

当发布一个链接作为答案时,请包含足够的内容,答案是有用的,以防链接后来中断。 – 2012-11-08 13:21:10