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