PHP / MySQLを使用した階層再帰メニュー
質問
これは(できれば)答えるのが非常に簡単な質問であるべきです。
mySQLデータベースの再帰メニューが機能していますが、現在の主な問題は次のとおりです。
URLを作成する最良の方法は何ですか? / eggs / milk / bacon /のような各行のタイトルを持ち込みたいです。卵はレベル0で、卵-0、牛乳-1、ベーコン-2などです。これを動的に出力する方法についてのアイデアはありますか?
「クレトス」のようなものを探しています。この質問についていくつかコメントを述べました。 PHP / MySQL-ナビゲーションメニュー階層の構築
しかし、その方法についてもう少し説明が必要です。
解決
メニューツリーを頻繁に変更する場合を除き、各メニュー項目に必要な階層URLを事前に保存するのがおそらく最も簡単です(実行時の解決のため)。
ツリーが十分に頻繁に変更されることが予想される場合、たとえば、Webインターフェースを使用して、メニューを読むたびにパスを生成する方が簡単です。次のようになります。
id | name | parent
----+--------+-------
0 | eggs | NULL
1 | milk | 0
2 | bacon | 1
3 | tomato | 0
4 | lettuce| 1
foreach (query("SELECT * FROM menu ORDER BY parent ASC") as $row) {
$menuitem = array_merge(array(), $row);
$menuLookup[$menuitem['id']] &= $menuitem;
if ($menuitem['parent'] == null) {
$menuitem['path'] = "/" . $menuitem['name'];
$menu[] &= $menuitem[];
} else {
$parent &= $menuLookup[$menuitem['parent']];
$menuitem['path'] = $parent['path'] . "/" . $menuitem['name'];
$parent['menu'][] &= $menuitem;
}
}
このコードはデバッグしていませんが、正確性についてのみテストしました;-)
他のヒント
まあ、階層が必要な場合は、「Modified Preorder Tree Traversal」と呼ばれる最良の方法を知ってください。これはこのSitepointの記事で詳細に説明されており、中途半端に始まります。 。
Gussが提案したものとの主な違いは、パフォーマンスが少し向上し、探しているツリーの一部のみをフェッチする方がはるかに簡単なことです。
所属していません StackOverflow