Рекурсивная функция Laravel 5.5 для создания меню

Я создал таблицу mysql, как показано ниже:

id | menuname          | parentid
---+-------------------+---------
 1 | dashboard         |        0
 2 | Content           |        0
 3 | Home Page Content |        2
 4 | Banners           |        2
 5 | Settings          |        0
 6 | Block Content     |        3
 7 | Site Content      |        3

Чтобы структура меню выглядела так:

  • приборная панель
  • Содержание
    • Содержание домашней страницы
      • Блокировать контент
      • Контент сайта
  • Баннеры
  • Настройки

Имею контроллер:

public function index() {
    $data = array();

    $permissionRecord = Permission::all();
    $this->categoryTree($permissionRecord);

    dd('-end-);
    $data['permissionRecord'] = $permissionRecord;

    return view('Administrator.permission.permissionAdd',$data);
}

function categoryTree($permissionRecord, $parent_id = 0, $sub_mark = '')
{
    foreach($permissionRecord as $row) {
        echo $sub_mark.$row->name;

        $this->categoryTree($permissionRecord, $row->id, $sub_mark.'---');
    }
}

Но это показывают данные:

Dashboard---Dashboard------Dashboard---------Dashboard------------Dashboard---------------Dashboard------------------Dashboard---------------------Dashboard------------------------Dashboard---------------------------Dashboard------------------------------Dashboard---------------------------------Dashboard------------------------------------Dashboard

Обратите внимание, я dd () внутри контроллера и не передавал данные в представление.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
623
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не учли родительский идентификатор:

function categoryTree($permissionRecord, $parent_id = 0, $sub_mark = '')
{
    foreach($permissionRecord as $row) {
        if ($row->parentid == $parent_id) {
            echo $sub_mark.$row->name;

            $this->categoryTree($permissionRecord, $row->id, $sub_mark.'---');
        }
    }
}

Попробуйте это и посмотрите, что произойдет - обратите внимание, что я заключил рекурсивный вызов функции в if (), который проверяет, совпадает ли текущая запись parentId с родительским идентификатором, переданным в метод.

Чтобы он отображал элементы в списке с отступом:

public function categoryTree($permissionRecord, $parent_id = 0)
{
    $html = '<ul>';

    foreach($permissionRecord as $row) {
        if ($row->parentid == $parent_id) {
            $html .= '<li>' . $row->menuname;

            $html .= $this->categoryTree($permissionRecord, $row->id, $html);

            $html .= '</li>';
        }
    }

    $html .= '</ul>';

    return $html;
}

Тогда просто позвоните:

$html = $this->categoryTree($permissionRecord);

Пример работы с модульным тестом

извините, попробуйте заменить $row->name на $row->menuname

Phil Cross 17.05.2018 15:33

Благодаря тонну!! Но как я могу представить это в поле зрения? как вы заметили, что у меня есть dd () внутри контроллера.

Niladri Banerjee - Uttarpara 17.05.2018 15:39

Обновили примером. Не совсем так, как я бы это сделал, но работает.

Phil Cross 17.05.2018 15:49

$ arr = $ this-> categoryTree ($ permissionRecord); - его показывать как null

Niladri Banerjee - Uttarpara 17.05.2018 15:52

Вы возвращаетесь из функции вместо использования echo?

Phil Cross 17.05.2018 15:54

На самом деле мне нужно вызвать то же самое или передать $ data [html] для просмотра из контроллера laravel

Niladri Banerjee - Uttarpara 17.05.2018 15:55

Позвольте нам продолжить обсуждение в чате.

Niladri Banerjee - Uttarpara 17.05.2018 15:56

Другие вопросы по теме