4

したがって、最終的なメニューは次のようになります。

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

表示するにはどうすればよいですか?私の推測では、すべてのアイテムを多次元配列に格納してから、何らかの方法でループする必要があります...

4

5 に答える 5

8

階層データは、リレーショナル データベース (これSTART WITH/CONNECT BYを処理するオペレーターがいる Oracle を除く) ではやや厄介です。基本的に、隣接リストとネストされたセットの 2 つのモデルがあります。

隣接セットを選択しましたが、これは私が通常行っていることでもあります。ネストされたセット モデルは単一のクエリで正しい順序で取得できますが、ネストされたセット モデルよりもはるかに簡単に変更できます。隣接リストはできません。中間データ構造 (ツリー) を構築し、それをリストに変換する必要があります。

私がすること(そして実際に最近行ったこと)は次のとおりです。

  • 親 ID 順に並べられた 1 つのクエリでメニュー コンテンツ全体を選択します。
  • 連想配列またはクラス/オブジェクトを使用してメニュー構造のツリーを構築します。
  • そのツリーをたどって、ネストされた順序なしリストを作成します。と
  • Superfishのような jQuery プラグインを使用して、そのリストをメニューに変換します。

次のようなものを構築します。

$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 のネストされたリスト マークアップを作成する再帰的なツリー ウォーク関数を使用しますが、その実装は読者の演習として残します。:)

于 2009-01-25T15:16:28.557 に答える
7

データ構造をそのまま扱うと、多くの場合、ツリーを構築するために再帰または複数のクエリが必要になります。

階層を格納する他の方法を検討しましたか? 変更された事前注文トラバーサルをチェックしてください -これについての素敵な PHP ベースの記事があります

于 2009-01-25T15:16:48.990 に答える
1

同様の質問に、MySQL 階層データ (隣接リスト) をメニュー (HTML) に変換する独自のアプローチを投稿しました。

再帰は使用しません。また、データベースへの単一のクエリが必要です。

でもっと読む

https://stackoverflow.com/questions/2871861#3368622

ありがとう。

于 2010-07-30T04:23:24.550 に答える
1

階層データを保存する方法は、必要なほど効率的ではありません。数年前に「 MySQL での階層データの管理」という記事を読み、SQL で階層ベースのデータを管理するための最良のソリューションであることがわかりました。次の利点は、1 回のクエリでツリー全体を取得できることです。

于 2009-01-25T16:02:27.947 に答える
0

ネストされたセットを使用したくない場合に階層を生成できるもう 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

各項目の前の数字をフィールドに格納し、長さ (その位置の深さを表す) に基づいて解析して、その項目がどこにあるのかについて知る必要があるすべての情報を伝えることができます。

計算などを必要とするより複雑なものにはネストされたセット階層を使用しますが、このアプローチがうまく機能していることがわかります

于 2009-01-25T16:51:17.897 に答える