php 使用RecursiveDirectoryIterator排序目录列表

tsm1rwdh  于 2023-01-12  发布在  PHP
关注(0)|答案(4)|浏览(120)

我正在使用RecursiveDirectoryIteratorRecursiveIteratorIterator来构建一个文件列表树,代码如下。我需要对列表进行排序--或者按目录的字母顺序排序,或者只按字母顺序排序。
谁能告诉我如何对文件列表进行排序?

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

ojsjcaue1#

有多种选项可供选择,您可以使用这些选项以某种方式对迭代器进行排序,最佳选项在很大程度上取决于您希望如何操作迭代器内容、您希望从迭代器中得到什么以及您真正想要/需要多少迭代器。
办法各不相同;使用SplHeap(或MinMax变体)、SplPriorityQueue(可能用于文件大小)等类,或者只是将迭代器 Package 在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
wlzqhblo

wlzqhblo2#

使用迭代器本身是不可能的,我在SO上的某个地方看到了Iterator类的扩展,它做了排序,但我模糊地记得在使用它时遇到了麻烦。
也许this question的答案有帮助,即使它们指向迭代器之外?

更新Here是对您的问题的一个复制,有一些答案--尽管没有多少答案!

elcex8rz

elcex8rz3#

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/

yzckvree

yzckvree4#

滑稽的方式:

$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($dir, $ropts));
$files2=[];
foreach($files as $f)$files2[] = (string)$f;
natcasesort($files2);
$files = $files2; #now filelist sorted

相关问题