我使用Symfony的查找器在目录中搜索特定的文件名。我需要按目录深度对结果进行排序。深度为0的文件(根文件夹)应位于顶部,深度为7的文件应位于最后。
可用的排序机制仅按名称排序,而不考虑目录的深度。例如。 “按名称排序”
$finder->sortByName(true);
a/acme/conf.yaml
conf.yaml
m/conf.yaml
o/data/a/b/c/d/conf.yaml
t/data/conf.yaml
w/data/conf.yaml
我希望conf.yaml
位于顶部,o/data/a/b/c/d/conf.yaml
应该位于底部。
我在Symfony(https://github.com/symfony/symfony/issues/11289)中发现了一个问题,但没有建议使用整洁的排序方法。
答案 0 :(得分:0)
Symfony允许设置自定义排序机制:https://symfony.com/doc/current/components/finder.html#sorting-results
要比较深度,我计算路径中的斜线并按照此答案中的建议对计数进行排序:https://stackoverflow.com/a/2852918/3894752
这对于目录深度(<64位)足够了。
如果两个文件的深度相同,则文件名将再次用于排序。
$finder->sort(static function (\SplFileInfo $a, \SplFileInfo $b) {
$depth = substr_count($a->getRealPath(), '/') - substr_count($b->getRealPath(), '/');
return ($depth === 0)? strcmp($a->getRealPath(), $b->getRealPath()) : $depth;
});
conf.yaml
m/conf.yaml
a/acme/conf.yaml
t/data/conf.yaml
w/data/conf.yaml
o/data/a/b/c/d/conf.yaml