14

以下のようなコードを使用してファイルリストツリーを構築するためにRecursiveDirectoryIteratorandを使用しています。RecursiveIteratorIteratorリストをソートする必要があります-ディレクトリ、ファイル、アルファベット順のいずれかです。

ファイルリストをソートする方法を誰か教えてもらえますか?

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

3 に答える 3

27

複数のオプションが利用可能で、イテレータを何らかの方法でソートするために使用できます。最適なオプションは、イテレータの内容を正確にどのように操作したいか、イテレータから何を取得したいか、実際に必要な/必要なイテレータの量に大きく依存します。

アプローチはさまざまです。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
于 2010-05-28T20:19:27.683 に答える
0

これは、イテレータ自体を使用することはできません。SOのどこかで、並べ替えを行ったクラスの拡張を見たことIteratorがありますが、問題があったことをぼんやりと覚えています。

この質問への回答は、イテレータから離れている場合でも役立つのではないでしょうか。

更新ここにいくつかの答えがあるあなたの質問への重複があります-確かに多くはありませんが!

于 2010-05-28T15:48:24.593 に答える
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;
        }
}

ソース: https://ruempler.eu/2008/08/09/php-sortingiterator/

于 2011-10-26T09:42:53.890 に答える