コードは2つのレベルのメニューしか生成しません。必要なレベルを通過する必要がある場合は、再帰を使用する必要があると思います。
これは、データベース構造とサンプルに基づく例です。この例では、さまざまなレベルでメニューを生成します。メニュー項目の名前には英語のラベルが使用されています。
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');
function drawMenu($db, $parent, $level = null){
$m = $db->prepare(" SELECT * FROM
administrator_menu, administrator_menu_description
where administrator_menu.id = administrator_menu_description.id
and language_id = 2
and parent_id = $parent");
$m->execute();
foreach ($m->fetchAll() as $menu_row) {
$m = $db->prepare("SELECT count(*) FROM administrator_menu where parent_id = $menu_row[id]");
$m->execute();
// The item is parent, so do recursion again
if($m->fetchAll()[0][0] !== '0' && $level !== 0){
echo "<li>" . $menu_row['label']."<ul>";
drawMenu($db, $menu_row[0], $level - 1);
echo "</ul></li>";
}else{ // The item is a leaf or we reach the end level, i.e. base case, so do print the item label
echo "<li>" . $menu_row['label'] . "</li>";
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<?php
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 0); // level 0
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 1); // level 1
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 2); // level 2
echo "</ul></div>";
?>
</body>
</html>
すべてのレベルを描画するには:
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
drawMenu
関数は次のように機能します:
- 最初に
$db
を渡します データベースクエリを実行するオブジェクト、$parent
ツリーは$level
で始まります 木のレベルのために。 - 関数は、指定された
$parent
の子を選択することから始まります。foreach ($m->fetchAll() as $menu_row) {...}
ごとにループします 。 -
ループには2つのケースがあります:
-
アイテムはリーフです。つまり、他のアイテムの親ではありません。または、ツリーの最終レベルに到達します。このケースはベースケースと呼ばれます 、再帰が停止し、値
echo "<li>" . $menu_row['label'] . "</li>";
-
アイテムは親です。この場合、
drawMenu
と呼びます。 アイテムID$menu_row[0]
で再び機能します 親として、$level - 1
レベルの終わりに達したときに必ず停止するようにします。
-
コードをテストし、ニーズに合わせて変更します。