@TANK_IST

Как вывести список категорий с неограниченым количеством подкатегорий?

Есть таблица с категориями.
5a57c11634a19293028064.png
Нужно вывести весь список категорий включая потомков.
Примерно так Shoes > Nike > Jordan

Написал таке:
$count = 0;

while (count($category)) {
	foreach ($category as $key => $value) {
		if ($value['parent'] == 0) {
			$catalog[$value['id']] = 1;
			unset($category[$key]);
		}
		else if (array_key_exists($value['parent'], $catalog))
		{
			if ($catalog[$value['parent']] === 1) {
				$catalog[$value['parent']] = [];
			}
			$catalog[$value['parent']][$value['id']] = 1;
			unset($category[$key]);
		}
		else
		{
			array_walk_recursive($catalog, function (&$item, $k) {
				global $value, $category, $key;

				if ($k == $value['parent']) {
					if ($item === 1) {
						$item = [];
					}
					$item[ $value['id'] ] = 1;
					unset($category[$key]);
				}
			});
			unset($item, $k);
		}
	}

	$count++;

	if ($count > 100) {
		break;
	}
}


Но к сожалению не все категории выводит.

Как реализовать такой вывод?
  • Вопрос задан
  • 121 просмотр
Решения вопроса 1
AlekseyArh
@AlekseyArh
Кибер существо
Можно подготовить дерево

function tree ($data = [], $parent = 'parent', $child = 'child') {

    if (!empty($data)) {

        $tree = [];

        foreach($data as $id => &$row) {

            if (empty($row[$parent])) {

                $tree[$id] = &$row;

            } else {

                $data[$row[$parent]][$child][$id] = &$row;

            }

        }

        return $tree;

    }

}

$data = [
    1 => [
        'name'   => 1,
        'parent' => 0
    ],
    2 => [
        'name'   => 2,
        'parent' => 1
    ],
    3 => [
        'name'   => 3,
        'parent' => 1
    ],
    4 => [
        'name'   => 4,
        'parent' => 3
    ],
    5 => [
        'name'   => 5,
        'parent' => 4
    ]
];

print_r(tree($data));


Потом как то рекурсивно отрендерить шаблон

function recursion (array $data = []) {

    foreach ($data as $row) {

        if (isset($row['id'])) {

            echo '<div>' . $row['name'] . '</div>';
            echo '<div class="child">';
            if (isset($row['child'])) {
                recursion($row['child']);
            }
            echo '</div><br>';

        }

    }

}

recursion(tree($data));


<div>один</div>
<div class="child">
   <div>два</div>
   <div class="child"></div>
</div>
<div>три</div>
<div class="child">
   <div>четыре</div>
   <div class="child">
       <div>пять</div>
      <div class="child"></div>
</div>
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
BojackHorseman
@BojackHorseman Куратор тега PHP
...в творческом отпуске...
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Depcon Екатеринбург
от 100 000 до 170 000 ₽
ManyChat Москва
от 150 000 ₽
от 210 000 до 250 000 ₽