Создание древовидной структуры из MySQL

Моя структура таблицы выглядит следующим образом:

id | name | reporting_to
1  | AAA  | 0
2  | BBB  | 1
3  | CCC  | 2
4  | DDD  | 2
and so on...

я хотел бы напечатать его так, чтобы он генерировал как таковой

<ul>
<li> AAA
<ul>
<li>BBB
<ul>
<li>CCC</li>
<li>DDD<li>
</ul>
</li>
</ul>
</li>
</ul>

Мой текущий код работает с одним маленьким уловом:

function make_tree($parent, $array, $level = 0){
if(!is_array($array) || empty($array)) return FALSE;

$output = '<ul>';
foreach($array as $index => $item)
{
if($item->reporting_to == $parent)
{
$output .= '<li>'.$item->name;
$output .= $this->make_tree($item->id, $array, $level+1);
$output .= '</li></li>';
}
}
$output .= '</ul>';
return $output;
}

Код выше печатает следующее:
// Обратите внимание, как <ul> печатается на всех последних детей.

<ul>
<li>AAA
<ul>
<li>BBB
<ul>
<li>CCC</li>
<ul></ul> // How do i get rid of this ?
<li>DDD</li>
<ul></ul> // This one too...
</ul>
</li>
</ul>
</li>
</ul>

Я не уверен, как удалить <ul> на каждого последнего ребенка. Может ли кто-нибудь помочь мне структурировать <ul>? Благодарю.

РЕДАКТИРОВАТЬ:

Я думаю, что лучший вопрос:

Используя мой существующий код, как я должен определить, является ли данный узел
последний дочерний элемент (у этого конкретного узла больше нет дочерних элементов).

0

Решение

Вы можете сделать это позже, а также удалить

от петли швов до дублирования:

function make_tree($parent, $array, $level = 0){
if(!is_array($array) || empty($array)) return FALSE;

$output = '<ul>';
$hasChildren = false;
foreach($array as $index => $item)
{
if($item->reporting_to == $parent)
{
$hasChildren = true;
$output .= '<li>'.$item->name;
$output .= $this->make_tree($item->id, $array, $level+1);
$output .= '</li>';
}
}
if(!$hasChildren){
return '';
}
$output .= '</ul>';
return $output;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]