Я создал таблицу 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 () внутри контроллера и не передавал данные в представление.






Вы не учли родительский идентификатор:
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);
Пример работы с модульным тестом
Благодаря тонну!! Но как я могу представить это в поле зрения? как вы заметили, что у меня есть dd () внутри контроллера.
Обновили примером. Не совсем так, как я бы это сделал, но работает.
$ arr = $ this-> categoryTree ($ permissionRecord); - его показывать как null
Вы возвращаетесь из функции вместо использования echo?
На самом деле мне нужно вызвать то же самое или передать $ data [html] для просмотра из контроллера laravel
Позвольте нам продолжить обсуждение в чате.
извините, попробуйте заменить
$row->nameна$row->menuname