代码之家  ›  专栏  ›  技术社区  ›  Scott Saunders

使用RecursiveDirectoryIterator对目录列表排序

  •  13
  • Scott Saunders  · 技术社区  · 15 年前

    我在用 RecursiveDirectoryIterator RecursiveIteratorIterator 使用如下代码构建文件列表树。我需要对列表进行排序-要么目录然后文件按字母顺序,或只是按字母顺序。

    $dir_iterator = new RecursiveDirectoryIterator($groupDirectory);
    $iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
    foreach ($iterator as $file) {
        // do stuff with $file
    }
    
    3 回复  |  直到 12 年前
        1
  •  0
  •   Community CDub    8 年前

    这不可能使用迭代器本身。我看到一个扩展到 Iterator 在某处上课,这样做排序,但模糊地记得有麻烦。

    也许答案是 this question 帮助,即使他们远离迭代器?

    : Here 你的问题有一些答案,这是个骗局——当然,答案不多!

        2
  •  26
  •   salathe    15 年前

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

    方法会有所不同;利用像这样的类 SplHeap Min , Max 品种), SplPriorityQueue ArrayObject 它可以对自己的内容进行排序。

    我会用一个 散堆 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
    
        3
  •  0
  •   Potherca Zaid Amireh    8 年前

    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