Каким образом можно получить полное древо категорий из файла в формате 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.
Набросал пару функций <br/> <pre><code class="php">/**
 * @param array&lt;int, array&gt; $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) . ' &gt; ' . $categoryName;
    } else {
        return $categoryName;
    }
}

/**
 * @param array&lt;array&gt; $array
 * @return array&lt;mixed, array&gt;
 */
function indexArrayByColumn(array $array, string $column): array
{
    return array_combine(array_column($array, $column), $array);
}</code></pre> <br/> <br/> Пример использования: <br/> <pre><code class="php">$categories = [
    ['id' =&gt; 1,  'parent_id' =&gt; null, 'name' =&gt; 'Электроника'],
    ['id' =&gt; 2,  'parent_id' =&gt; 1,    'name' =&gt; 'Ноутюуки'],
    ['id' =&gt; 3,  'parent_id' =&gt; 2,    'name' =&gt; 'Apple'],
    ['id' =&gt; 4,  'parent_id' =&gt; 2,    'name' =&gt; 'Acer'],
    ['id' =&gt; 5,  'parent_id' =&gt; 2,    'name' =&gt; 'HP'],
    ['id' =&gt; 6,  'parent_id' =&gt; 2,    'name' =&gt; 'Dell'],
    ['id' =&gt; 7,  'parent_id' =&gt; 1,    'name' =&gt; 'Холодильники'],
    ['id' =&gt; 8,  'parent_id' =&gt; 1,    'name' =&gt; 'Телевизоры'],
    ['id' =&gt; 9,  'parent_id' =&gt; null, 'name' =&gt; 'Одежка'],
    ['id' =&gt; 10, 'parent_id' =&gt; 9,    'name' =&gt; 'Куртки'],
    ['id' =&gt; 11, 'parent_id' =&gt; 9,    'name' =&gt; 'Штаны'],
    ['id' =&gt; 12, 'parent_id' =&gt; null, 'name' =&gt; 'Игрушки'],
];

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

foreach ($categories as $categoryId =&gt; $_) {
    echo getCategoryPath($categoryId, $categories);
    echo PHP_EOL;
}</code></pre> <br/> <br/> Результат: <br/> <pre><code class="bash">php categories/script.php
Электроника
Электроника &gt; Ноутюуки
Электроника &gt; Ноутюуки &gt; Apple
Электроника &gt; Ноутюуки &gt; Acer
Электроника &gt; Ноутюуки &gt; HP
Электроника &gt; Ноутюуки &gt; Dell
Электроника &gt; Холодильники
Электроника &gt; Телевизоры
Одежка
Одежка &gt; Куртки
Одежка &gt; Штаны
Игрушки</code></pre> <br/> <br/> У этого кода преимущество в том, что путь будет корректно строиться при любой вложенности категорий
Похожие вопросы