1

モデル: id:name:parentId のようなテーブルがあります。parentId は ID を参照します。ツリーを構築する単純な再帰。

例:

  1. 1:ルート:ヌル
  2. 2:見出し1:1
  3. 3:見出し2:1
  4. 4:小見出し1.1:2

私のコントローラーでは、データベースを呼び出して、データをビューに渡します。私がそうするなら、私は自分のビューの中に関数を持っているでしょう。私は私の見解では機能が好きではありません:)。

他のアプローチは、それを何らかの方法でソートすることです。しかし、これは本当に違いを生むでしょうか?

  • そのためには、補助フィールドを使用して自分がどのレベルにいるのかを知る必要があります。したがって、並べ替えられた配列を反復処理できます。
  • または他のアプローチ: 多次元配列。その木がどれだけ深くなるかわからないので、無意味かもしれません。

任意の推奨事項に感謝します。前もって感謝します。

編集:データをオブジェクトとして受け取っています。

4

3 に答える 3

2

MVC フレームワーク ベースの設計 (ファット モデル、スリム コントローラー) の傾向によると、モデルを使用してデータを取得し、入れ子になったデータ セット (多次元配列) をコントローラー/ビューに配信することをお勧めします。階層がどれだけ深くても、それは有限です。

質問は少し広く尋ねられているため、それがどのような種類のデータであるか、常にデータ全体を一度に必要とするのか、それとも相対的なチャンクだけを必要とするのかは明確ではありません。いずれにせよ、階層を維持したいと思うので、ネストされた配列を反復処理することに慣れていない場合は、(Std)Objects を使用する代替手段が常にあります。

于 2012-10-16T06:24:58.517 に答える
1

ここを見ると、ネストされたツリー (テーブル) が表示されます。ボタンをクリックしTo Arrayます。次のような配列が表示されます。

    '0' ...
        'item_id' ...
        'parent_id' => "none"
        'depth' => "0"
        'left' => "1"
        'right' => "22"
    '1' ...
        'item_id' => "1"
        'parent_id' ...
        'depth' => "1"
        'left' => "2"
        'right' => "7"

ここleftright説明されていることに注意してください

このようにして、深さと木の一部を取得することもできます。

于 2012-10-16T06:47:37.530 に答える
0

モデルで多次元配列を構築し、それをビューに渡します。

ポインターを使用すると、再帰なしで多次元配列を作成できます。

// collect tree
$res=$Conn->query('SELECT id, name, parentId FROM tree');

// if your root node has parent 0
$tree[0]->children=array();

// build into one array
// every node is found from its $tree[parentId]->children[id]
// and from $tree[id]
foreach($res as $row)
{
    $tree[$row['id']]->data=$row;

    if(!isset($tree[$row['id']]->children))
        $tree[$row['id']]->children=array();

    $tree[$row['parentId']]->children[$row['id']]=&$tree[$row['id']];
}
于 2012-10-16T06:44:49.917 に答える