Bagaimana dengan:
function 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>';
}
Fungsi ini mengharuskan Anda terlebih dahulu menanyakan database Anda untuk seluruh daftar kategori yang tersedia dan mengasumsikan bahwa kategori akar Anda memiliki nilai null, tetapi fungsi tersebut dapat diubah untuk menerima -1 atau 0 bergantung pada cara kerja skema Anda saat ini.
$categories = { get from database into an multi-dimensional array };
$Tree = $this->recurse($categories);
echo $Tree;
Anda dapat mempertimbangkan untuk melakukan hal berikut untuk mencegah munculnya UL kosong saat tidak ada anak untuk orang tua:
function 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>';
}
Namun, solusi terbaik adalah dengan memilih data Anda untuk menyertakan kolom yang berisi berapa banyak kategori anak yang dimiliki setiap kategori.
select Category.*, (select count(distinct c1.id) from Category as c1 where c1.root = Category.id) as ChildCount from Category
Di mana fungsi Anda akan menjadi:
function 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>';
}
Semoga membantu?