A co powiesz na:
Rekurencja funkcjifunction recurse($categories, $parent = null, $level = 0)
{
$ret = '<ul>';
foreach($categories as $index => $category)
{
if($category['root'] == $parent)
{
$ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
$ret .= $this->recurse($categories, $category['id'], $level+1);
$ret .= '</li>';
}
}
return $ret . '</ul>';
}
Ta funkcja wymaga, abyś najpierw przesłał zapytanie do bazy danych o całą listę dostępnych kategorii i zakłada, że kategorie główne mają wartość null, ale funkcję można zmienić tak, aby akceptowała -1 lub 0, w zależności od tego, jak działa bieżący schemat.
$categories = { get from database into an multi-dimensional array };
$Tree = $this->recurse($categories);
echo $Tree;
Możesz rozważyć wykonanie następujących czynności, aby zapobiec pojawianiu się pustych UL, gdy dla rodzica nie ma dzieci:
Rekurencja funkcjifunction recurse($categories, $parent = null, $level = 0)
{
$ret = '<ul>';
foreach($categories as $index => $category)
{
if($category['root'] == $parent)
{
$ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
$sub = $this->recurse($categories, $category['id'], $level+1);
if($sub != '<ul></ul>')
$ret .= $sub;
$ret .= '</li>';
}
}
return $ret . '</ul>';
}
Jednak najlepszym rozwiązaniem byłoby wybranie danych tak, aby zawierały kolumnę zawierającą liczbę kategorii podrzędnych w każdej kategorii.
select Category.*, (select count(distinct c1.id) from Category as c1 where c1.root = Category.id) as ChildCount from Category
W jakiej funkcji byłoby:
Rekurencja funkcjifunction recurse($categories, $parent = null, $level = 0)
{
$ret = '<ul>';
foreach($categories as $index => $category)
{
if($category['root'] == $parent)
{
$ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
if($category['ChildCount'] > 0)
$ret .= $this->recurse($categories, $category['id'], $level+1);
$ret .= '</li>';
}
}
return $ret . '</ul>';
}
Mam nadzieję, że to pomoże?