В курсе PHP: Функции мы проходили три основные функции высшего порядка по работе с коллекциями: array_map()
, array_filter()
и array_reduce()
. С помощью них можно решать практически любые задачи.
src/solution.php
В этом испытании вам предстоит написать собственную реализацию этих функций, только работать они будут с файловыми деревьями.
map()
принимает на вход функцию-обработчик и дерево, а возвращает отображенное дерево.
filter()
принимает в качестве параметров предикат и дерево, а возвращает отфильтрованное дерево по предикату.
reduce()
кроме основных параметров (функция-обработчик и дерево) принимает также начальное значение аккумулятора.
<?php
use function Php\Immutable\Fs\Trees\trees\mkdir;
use function Php\Immutable\Fs\Trees\trees\mkfile;
use function Php\Immutable\Fs\Trees\trees\getName;
use function Php\Immutable\Fs\Trees\trees\isFile;
use function Php\Immutable\Fs\Trees\trees\isDirectory;
use function App\solution\map;
use function App\solution\filter;
use function App\solution\reduce;
$tree = mkdir('/', [
mkdir('eTc', [
mkfile('config.json')
]),
]);
Приводим имена всех директорий и файлов к верхнему регистру:
map(fn($node) => array_merge($node, ['name' => strtoupper(getName($node))]), $tree);
// [
// 'name' => '/',
// 'type' => 'directory',
// 'meta' => [],
// 'children' => [
// [
// 'name' => 'ETC',
// 'type' => 'directory',
// 'meta' => [],
// 'children' => [['name' => 'CONFIG.JSON', 'type' => 'file', 'meta' => []]],
// ],
// ],
// ]
Отфильтровываем директории:
filter(fn($node) => isDirectory($node), $tree);
// [
// 'name' => '/',
// 'type' => 'directory',
// 'meta' => [],
// 'children' => [
// [
// 'name' => 'eTc',
// 'type' => 'directory',
// 'meta' => [],
// 'children' => [],
// ],
// ],
// ]
Подсчитываем количество узлов в дереве:
reduce(fn($acc) => $acc + 1, $tree, 0);
// 3
Для полного доступа к испытанию нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.