Php: Отображение, фильтрация, свёртка

PHP: Деревья 10 сообщений
Обновлено: 08 сент., 18:22
69
Студентов
78%
Завершения

В курсе 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

Для полного доступа к испытанию нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов