Задать вопрос
@jazzman7

Как сделать рекурсивное, бесконечное меню?

Здравствуйте есть таблица menu со столбцами id name about parent_id
На странице есть данный код
$obs = $pdo->prepare("SELECT * FROM `menu` ORDER BY `id` DESC");
$obs->execute();
$obs = $obs->fetchAll();
$arr = array();
foreach ($obs as $item) {
echo $item['name'];
}


как я только не пробовал вывести список рекурсивно, часа 4 потратил, все из интернета перепробовал уже, один раз получилось вывести, но выводился только один элемент родителя и то данный код потерял. А мне надо выводить бесконечное число вложений на любых уровнях, еще немного и я головой клаву начну ломать, спасите пожалуйста мою психику и клавиатуру...
  • Вопрос задан
  • 152 просмотра
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
@alexanderzanin
Вот пример без запроса к базе
<?php

$arr = array(
    array('id'=>100, 'parentid'=>0, 'name'=>'a'),
    array('id'=>101, 'parentid'=>100, 'name'=>'a'),
    array('id'=>102, 'parentid'=>101, 'name'=>'a'),
    array('id'=>103, 'parentid'=>101, 'name'=>'a'),
    array('id'=>104, 'parentid'=>103, 'name'=>'a'),
    array('id'=>105, 'parentid'=>103, 'name'=>'a'),
    array('id'=>106, 'parentid'=>0, 'name'=>'a'),
    array('id'=>107, 'parentid'=>106, 'name'=>'a'),
);

$new = array();
foreach ($arr as $a){
    $new[$a['parentid']][] = $a;
}
$tree = createTree($new, array($arr[0]));
var_dump($tree);

function createTree(&$list, $parent){
    $tree = array();
    foreach ($parent as $k=>$l){
        if(isset($list[$l['id']])){
            $l['children'] = createTree($list, $list[$l['id']]);
        }
        $tree[] = $l;
    }
    return $tree;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@romicohen
Системный Архитектор
спасите пожалуйста мою психику и клавиатуру...


А почему непременно "рекурсивное"?

Вам требуется "иерархическое" меню, с "неограниченным уровнем вложенности", я бы так это назвал.

Давно уже не делал подобное, 2021 год все таки, composer... webpack... и всё такое :D но наверное подошел бы как-то так:

1. (допустим, root у на это id == 1), тогда надо получить массив значений, у которых parent_id == 1 - правильно? Мы получим 1-й уровень меню.

2. Потом поочередно, в цикле, берем каждый элемент из этого списка, и уже находим детей для него.

3. И т.д.

4. Результаты можно складывать в какой-нибудь объект или массив.

ну это, так, навскидку.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы