【问题标题】:Sort directory listing using RecursiveDirectoryIterator使用 RecursiveDirectoryIterator 对目录列表进行排序
【发布时间】:2011-02-25 04:51:13
【问题描述】:

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

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

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

【问题讨论】:

标签: php sorting recursion spl


【解决方案1】:

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

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

【讨论】:

  • 发布链接作为答案时,请包含足够的内容,以使答案本身有用,以防链接稍后断开。
【解决方案2】:

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

方法会有所不同;使用像SplHeap(或MinMax品种),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

【讨论】:

  • 这是可行的,但是.. 使用RecursiveIteratorIterator 我可以访问getDepth(),但是如果我实现了这个排序类,getDepth() 方法将无法访问。
【解决方案3】:

使用迭代器本身是不可能的。我在 SO 上的某处看到了 Iterator 类的扩展,它进行了排序,但模糊地记得遇到了麻烦。

也许this question 的答案有帮助,即使它们远离迭代器?

更新Here 是您的问题的一个骗子,提供了一些答案 - 诚然不多!

【讨论】:

  • 当。我认为这些迭代器真的会帮助我。谢谢佩卡。
猜你喜欢
  • 2013-07-26
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2013-04-25
相关资源
最近更新 更多