Каким образом можно получить полное древо категорий из файла в формате YML?

Как правильно описать древо категорий в стандартном yml файле?
  • 14 февраля 2024 г. 11:38
Ответы на вопрос 2
Для получения полного древа категорий из файла YML необходимо считать содержимое файла и преобразовать его в структуру данных, например, в объекты или словари. Затем можно использовать алгоритмы обхода дерева для построения полного древа категорий на основе полученных данных.

Описание древа категорий в стандартном YML файле может выглядеть следующим образом:

```yml
- Категория 1:
  - Подкатегория 1.1
  - Подкатегория 1.2
    - Подподкатегория 1.2.1
    - Подподкатегория 1.2.2
  - Подкатегория 1.3
- Категория 2:
  - Подкатегория 2.1
    - Подподкатегория 2.1.1
    - Подподкатегория 2.1.2
  - Подкатегория 2.2
```

Здесь каждая категория и подкатегория представлены в виде отдельной строки с отступом, где дефис "-" указывает на принадлежность категории к предыдущей. Таким образом, древо категорий можно представить в виде иерархической структуры с использованием отступов и дефисов.

Обработка и преобразование файла YML в полное древо категорий может выполняться с помощью различных библиотек, таких как `PyYAML` для языка Python или `yaml` для языка JavaScript.
Набросал пару функций 
/**
 * @param array<int, array> $categories
 */
function getCategoryPath(int $categoryId, array $categories): string|null
{
    $category = $categories[$categoryId] ?? null;

    if ($category === null) {
        return null;
    }

    $categoryName     = $category['name'];
    $categoryParentId = $category['parent_id'];

    if ($categoryParentId) {
        return getCategoryPath($categoryParentId, $categories) . ' > ' . $categoryName;
    } else {
        return $categoryName;
    }
}

/**
 * @param array<array> $array
 * @return array<mixed, array>
 */
function indexArrayByColumn(array $array, string $column): array
{
    return array_combine(array_column($array, $column), $array);
}


Пример использования:
$categories = [
    ['id' => 1,  'parent_id' => null, 'name' => 'Электроника'],
    ['id' => 2,  'parent_id' => 1,    'name' => 'Ноутюуки'],
    ['id' => 3,  'parent_id' => 2,    'name' => 'Apple'],
    ['id' => 4,  'parent_id' => 2,    'name' => 'Acer'],
    ['id' => 5,  'parent_id' => 2,    'name' => 'HP'],
    ['id' => 6,  'parent_id' => 2,    'name' => 'Dell'],
    ['id' => 7,  'parent_id' => 1,    'name' => 'Холодильники'],
    ['id' => 8,  'parent_id' => 1,    'name' => 'Телевизоры'],
    ['id' => 9,  'parent_id' => null, 'name' => 'Одежка'],
    ['id' => 10, 'parent_id' => 9,    'name' => 'Куртки'],
    ['id' => 11, 'parent_id' => 9,    'name' => 'Штаны'],
    ['id' => 12, 'parent_id' => null, 'name' => 'Игрушки'],
];

// Индексируем массив по полю 'id'
$categories = indexArrayByColumn($categories, 'id');

foreach ($categories as $categoryId => $_) {
    echo getCategoryPath($categoryId, $categories);
    echo PHP_EOL;
}


Результат:
php categories/script.php
Электроника
Электроника > Ноутюуки
Электроника > Ноутюуки > Apple
Электроника > Ноутюуки > Acer
Электроника > Ноутюуки > HP
Электроника > Ноутюуки > Dell
Электроника > Холодильники
Электроника > Телевизоры
Одежка
Одежка > Куртки
Одежка > Штаны
Игрушки


У этого кода преимущество в том, что путь будет корректно строиться при любой вложенности категорий
Похожие вопросы