PHP Symfony Finder: сортировка по глубине каталога - PullRequest
0 голосов
/ 08 мая 2019

Я использую 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 голосов
/ 08 мая 2019

Symfony позволяет настроить собственные механизмы сортировки: https://symfony.com/doc/current/components/finder.html#sorting-results

Чтобы сравнить глубину, я посчитал косые черты на пути и отсортировал счет, как предложено в этом ответе: https://stackoverflow.com/a/2852918/3894752

Этого должно быть достаточно для глубины каталогов (<64-бит). </p>

Если два файла имеют одинаковую глубину, тогда для повторной сортировки используется имя файла.

$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
...