Набросал пару функций
/**
* @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
Электроника > Холодильники
Электроника > Телевизоры
Одежка
Одежка > Куртки
Одежка > Штаны
Игрушки
У этого кода преимущество в том, что путь будет корректно строиться при любой вложенности категорий