PHP / MySQL-ナビゲーションメニュー階層の構築
質問
したがって、最終的なメニューは次のようになります。
Item B
Item B-1
Item B-1-2
Item B-1-1
Item A
SubItem A-1
SubItem A-2
Item C
次のDBレコードに基づく:
id menu_title parent_menu_id menu_level weight
1 Item A 0 1 1
2 Item B 0 1 0
3 Item C 0 1 2
4 SubItem A-2 1 2 1
5 Item B-1 2 2 0
6 Item B-1-1 5 3 1
7 SubItem A-1 1 2 0
8 Item B-1-2 5 3 0
どのように表示するのですか?すべてのアイテムを多次元配列に格納し、それを何らかの方法でループする必要があると思います...
解決
データ構造の取り扱いには、多くの場合、ツリーを構築するための再帰または複数のクエリが含まれます。
階層を保存する他の方法を検討しましたか?変更された予約注文のトラバーサルを確認してください-これについての素晴らしい PHPベースの記事 。
他のヒント
リレーショナルデータベースでは、階層データが多少面倒です(これを処理するための演算子がSTART WITH/CONNECT BY
にあるOracleを除く)。基本的には 2つのモデルがあります:隣接リストとネストされたセット。
隣接セットを選択しました。これも私が通常行うことです。ネストされたセットモデルは、単一のクエリで正しい順序で取得できますが、ネストされたセットモデルよりも変更がはるかに簡単です。隣接リストはできません。中間データ構造(ツリー)を構築し、それをリストに変換する必要があります。
私がやろうとしている(そして実際に最近やったことは):
- 親IDで順序付けられた1つのクエリでメニューコンテンツ全体を選択します。
- 連想配列またはクラス/オブジェクトを使用してメニュー構造のツリーを構築します。
- そのツリーを歩いて、ネストされた順序なしリストを作成します。そして
-
メニュー。
次のようなものを作成します:
$menu = array(
array(
'name' => 'Home',
'url' => '/home',
),
array(
'name' => 'Account',
'url' => '/account',
'children' => array(
'name' => 'Profile',
'url' => '/account/profile',
),
),
// etc
);
そしてそれをこれに変換します:
<ul class="menu">;
<li><a href="/">Home</a></li>
<li><a href="/account">Account Services</a>
<ul>
<li><a href="/account/profile">Profile</a></li>
...
メニュー配列を生成するためのPHPは比較的簡単ですが、解決するには少し手間がかかります。 HTMLネストリストマークアップを作成する再帰的なツリーウォーク機能を使用しますが、読者への演習として実装を残します。 :)
階層データを保存する方法は、必要なほど効率的ではありません。数年前に MySQLで階層データを管理するという記事を読みました。その後、階層ベースのデータをSQLで管理するための最良のソリューションとして 見つけました。次に最大の利点は、1つのクエリでツリー全体を取得できると信じていることです。
同様の質問で、MySQL階層データ(隣接リスト)をメニュー(HTML)に変換する独自のアプローチを投稿しました
再帰を使用しないしない。また、データベースへの単一クエリが必要です。
続きを読む
https://stackoverflow.com/questions/2871861#3368622
ありがとう。
ネストされたセットを使用したくない場合に階層を生成できるもう1つの簡単な方法は、前に単純なテキスト文字列を使用することです。
Item B
Item B-1
Item B-1-2
Item B-1-1
Item A
SubItem A-1
SubItem A-2
Item C
なります
1 Item B
1.1 Item B1
1.1.1 Item B11
1.1.2 Item B12
2 Item A
2.1 Item A1
2.2 Item B2
3 Item C
各アイテムの前の数字をフィールドに保存し、長さ(現在の場所の深さを表す)に基づいて解析して、アイテムの行き先について知る必要があるすべての情報を伝えることができます。
計算を必要とするより複雑なものなどにはネストされたセット階層を使用していますが、このアプローチはうまく機能しています