Làm thế nào về:
Hàmfunction 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>';
}
Hàm này yêu cầu trước tiên bạn truy vấn cơ sở dữ liệu của mình cho toàn bộ danh sách các danh mục có sẵn và giả định rằng các danh mục gốc của bạn có giá trị null, nhưng hàm có thể được thay đổi thành chấp nhận -1 hoặc 0 tùy thuộc vào cách lược đồ hiện tại của bạn hoạt động.
$categories = { get from database into an multi-dimensional array };
$Tree = $this->recurse($categories);
echo $Tree;
Bạn có thể cân nhắc thực hiện những điều sau để ngăn chặn bất kỳ UL trống nào xuất hiện khi không có phần tử con nào tồn tại cho cha mẹ:
Hàmfunction 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>';
}
Tuy nhiên, giải pháp tốt nhất là chọn dữ liệu của bạn để đưa vào một cột chứa bao nhiêu danh mục con mà mỗi danh mục có.
select Category.*, (select count(distinct c1.id) from Category as c1 where c1.root = Category.id) as ChildCount from Category
Trong đó chức năng của bạn sẽ là:
Hàmfunction 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>';
}
Hy vọng điều đó sẽ hữu ích?