Poniższy kod powinien Ci pomóc. Jest to „funkcja rekurencyjna” – funkcja, która wywołuje samą siebie. Jak właśnie wspomniał @Fake51, nie jest to zbyt wydajne, ale powinno działać.
Będziesz potrzebować kodu CSS, aby ustrukturyzować utworzoną listę.
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();
Edycja:Ponieważ nadal nie ma zaakceptowanej odpowiedzi, oto mój kod zmodyfikowany, aby zrobić to wszystko za pomocą pojedynczego zapytania SQL, które powinno być znacznie bardziej wydajne, choć potencjalnie nieco bardziej mylące. Zobacz, jak ci idzie.
//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);