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

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

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

解决方案

使用迭代器本身是不可能的。我已经看到了 Iterator 上课的某个地方,所以确实分类了,但记得害羞地遇到了麻烦。

也许答案 这个问题 即使他们指向迭代器,他们的帮助?

更新: 这里 有一些答案是对您的问题的欺骗 - 不过,并不多!

其他提示

有多个可用的选项,您可以用它们以一种或另一种方式对迭代器进行分类。最好的选择将在很大程度上取决于您要如何操纵迭代器内容,要从迭代器中获得的内容以及您真正想要/需要的迭代器的数量或少量。

方法会有所不同;使用类似的课程 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

SönkeRuempler 有一个很好的解决方案:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top