Передать массив категорий.
function categoriesToTree($categories)
{
$map = [0 => ['subcategories' => []]];
foreach ($categories as &$category)
{
$category['subcategories'] = [];
$map[$category['id']] = &$category;
}
foreach ($categories as &$category)
$map[$category['parent_id']]['subcategories'][] = &$category;
return $map[0]['subcategories'];
}
На выходе получим

Мне необходимо было вывести все это в select.
Получившийся выше массив передаем в функцию
function build_options($categories, $level = 0)
{
$option = '';
foreach ($categories as $item)
{
$level = $item['parent_id'] == 0 ? 0 : $level + 1;
$name = str_repeat('-', $level) . $item['name'];
$option .= "<option value='" . $item['id'] . "' data-parent='" . $item['parent_id'] . "'>" . $name . "</option>";
if (count($item['subcategories']) > 0)
$option .= $this->build_options($item['subcategories'], $level);
}
return $option;
}
На выходе список тегов option, вставляем куда нужно и получаем.
