Đoạn mã dưới đây sẽ giúp bạn bắt đầu. Đó là một "hàm đệ quy" - một hàm gọi chính nó. Như @ Fake51 vừa đề cập, nó không hiệu quả lắm, nhưng nó sẽ hoạt động.
Bạn sẽ cần một số CSS để cấu trúc danh sách bạn đã tạo.
function showItems($parent = 0) {
$q = "SELECT id, name FROM category WHERE parent_id = $parent";
$q = mysql_query($q);
if(mysql_num_rows($q)) {
echo "<ul>";
while($r = mysql_fetch_row($q)) {
echo "<li>";
echo "<a href=\"page.php?id=".$r[0]."\">".htmlentities($r[1])."</a>";
showItems($r[0]);
echo "</li>"\n;
}
echo "</ul>\n";
}
}
showItems();
Chỉnh sửa:Vì vẫn chưa có câu trả lời được chấp nhận, đây là mã của tôi đã được sửa đổi để thực hiện tất cả với một truy vấn SQL duy nhất sẽ hiệu quả hơn nhiều, mặc dù có khả năng gây nhầm lẫn hơn một chút. Xem nó hoạt động như thế nào đối với bạn.
//Recursive function to show menu items from a passed in array
function showItems(&$menu, $parent = 0) {
if(is_array($menu[$parent]) && sizeof($menu[$parent])) {
echo "<ul>";
foreach($menu[$parent] as $num=>$name) {
echo "<li>";
echo "<a href=\"page.php?id=".$num."\">".htmlentities($name)."</a>";
showItems($menu, $num);
echo "</li>\n";
}
echo "</ul>\n";
}
}
//Create a multi-dimensional array of ALL menu items, separated by parent
$menu = array();
$q = "SELECT id, name, parent_id FROM category ORDER BY order";
$q = mysql_query($q);
while($r = mysql_fetch_row($q)) {
$menu[$r[2]][$r[0]] = $r[1];
}
//Call the function
showItems($menu);