PHP Symfony Finder:按目录深度排序

时间:2019-05-08 07:25:44

标签: php file symfony sorting finder

我使用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)中发现了一个问题,但没有建议使用整洁的排序方法。

1 个答案:

答案 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