使用recursiveDirectoryIterator对目录列表进行排序列表
题
我在用着 RecursiveDirectoryIterator
和 RecursiveIteratorIterator
使用以下代码构建文件列表树。我需要对列表进行排序 - 目录然后按字母顺序排列,或者按字母顺序排列。
谁能告诉我如何对文件列表进行排序?
$dir_iterator = new RecursiveDirectoryIterator($groupDirectory);
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $file) {
// do stuff with $file
}
其他提示
有多个可用的选项,您可以用它们以一种或另一种方式对迭代器进行分类。最好的选择将在很大程度上取决于您要如何操纵迭代器内容,要从迭代器中获得的内容以及您真正想要/需要的迭代器的数量或少量。
方法会有所不同;使用类似的课程 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;
}
}
不隶属于 StackOverflow