Le code ci-dessous devrait vous aider à démarrer. C'est une "fonction récursive" - une fonction qui s'appelle elle-même. Comme @Fake51 vient de le mentionner, ce n'est pas très efficace, mais ça devrait marcher.
Vous aurez besoin de CSS pour structurer la liste que vous avez produite.
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();
Edit :Puisqu'il n'y a toujours pas eu de réponse acceptée, voici mon code modifié pour tout faire avec une seule requête SQL qui devrait être beaucoup plus efficace, bien qu'un peu plus déroutant potentiellement. Voyez comment cela se passe pour vous.
//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);