Моя структура таблицы выглядит следующим образом:
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>
? Благодарю.
РЕДАКТИРОВАТЬ:
Я думаю, что лучший вопрос:
Используя мой существующий код, как я должен определить, является ли данный узел
последний дочерний элемент (у этого конкретного узла больше нет дочерних элементов).
Вы можете сделать это позже, а также удалить
от петли швов до дублирования:
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;
}
Других решений пока нет …