Попрактикуемся еще с одним вариантом агрегации данных на файловых системах. Напишем функцию, которая принимает на вход директорию и возвращает список директорий первого уровня вложенности и количество файлов в них и всех поддиректориях.
Внутри себя эта задача распадается на две:
- Подсчет количества файлов внутри директории
- Вызов функции подсчета файлов на каждой из поддиректорий
Начнем с подсчета количества файлов. Это классическая задача на агрегацию:
<?php
function getFilesCount($tree)
{
if (isFile($tree)) {
return 1;
}
$children = getChildren($tree);
$descendantsCount = array_map(fn($child) => getFilesCount($child), $children);
return array_sum($descendantsCount);
}
Следующий шаг заключается в том, чтобы извлечь всех детей из исходного узла и к каждому из них применить подсчет.
<?php
function getSubdirectoriesInfo($tree)
{
$children = getChildren($tree);
// Нас интересуют только директории
$filtered = array_filter($children, fn($child) => isDirectory($child));
// Запускаем подсчет для каждой директории
// При таком подходе некоторые узлы будут обходиться много раз
$result = array_map(fn($child) => [getName($child), getFilesCount($child)], $filtered);
return $result;
}
И пример использования:
<?php
$tree = mkdir('/', [
mkdir('etc', [
mkdir('apache'),
mkdir('nginx', [
mkfile('nginx.conf'),
]),
]),
mkdir('consul', [
mkfile('config.json'),
mkfile('file.tmp'),
mkdir('data'),
]),
mkfile('hosts'),
mkfile('resolve'),
]);
print_r(getSubdirectoriesInfo($tree));
// => [['etc', 1], ['consul', 2]]
https://repl.it/@hexlet/php-trees-search-getSubdirectoriesInfo
То есть мы обратились к детям напрямую, сначала отфильтровав их, а затем выполнили отображение на необходимый массив, содержащий для каждой директории имя и количество файлов в нем.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.