4

私はそのような問題で何時間も戦ってきました。Web ページを高速化するために、データベースにすべてのカテゴリを 1 回だけ取得するように要求し、PHP を使用して配列を並べ替えたいと考えています。

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => name1
            [parent] => 0
            [children] => 
        )
   [1] => Array
    (
        [id] => 2
        [name] => name2
        [parent] => 1
        [children] => 
    )
)

私はこのようなものを取得する必要があります

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => name1
            [parent] => 0
            [children] => Array
                  (
                      [id] => 2
                      [name] => name2
                      [parent] => 1
                      [children] => 
                  )
        )

)

それに関する問題は、どのレベルの階層にも対応できるようにすることです。サイクルで動作するように。助けてください!

4

5 に答える 5

4

ここでオーバーヘッドを削減するための解決策はたくさんあります。しかし、制約が何であるかを知らなければ、アプローチを推奨することは困難です。

例えば:

  1. 隣接モデルを使用します-dnagirlの回答に関する私のコメントを参照してください

  2. すべてのデータを PHP にロードし、再帰アルゴリズムを使用してネストされたツリーを作成します (これはかなり遅くなり、キャッシュを使用するとメリットがあります)。

  3. 深さ優先ツリー ウォークで並べ替えられた結果セットを返す再帰ストアド プロシージャを作成する

例 2 をコードに少し近づけると、次のようになります。

 function build_tree(&$unsorted, $start_node)
 {
     $out=array();
     foreach($unsorted as $key=>$node) {
        if ($node['parent']==$start_node) {
            $node['children']=build_tree($unsorted, $key);
            unset($unsorted[$key]);
            $out[]=$node;
        }
     }
     return $out;
 } 
 $threaded_tree=build_tree($list_of_nodes, 0); // assumes that the root is the first element
于 2011-01-31T17:41:06.750 に答える
0

あなたが探しているのは再帰と呼ばれます。私にとっては、phpで再帰を処理する方法があまり明確ではなく、この主題に関するドキュメントはほとんど空白です。

あなたはこれこの記事をチェックすることに興味があるかもしれません

于 2011-01-31T17:58:37.430 に答える
0
foreach ($dataFromMySQL as $e) {
    $all[$e['id']] = $e;
    $ref = &$all[$e['id'];
    if ($e['parent']) $all[$e['id']]['children'][] = $ref;
    else $hierarchy[$e['id']] = $ref;
}

これは、親が常にその子の前に移入されることを期待しています

于 2011-01-31T17:20:31.300 に答える
0

階層に隣接モデルを使用しています。データベースに複数回クエリを実行するか、レベルの数がわかっている場合は、各レベルの句を使用してユニオン クエリを作成する必要があります。

許可されている場合は、親がクリックされたときに子レベルが呼び出される AJAX ソリューションの方が、プログラミングが簡単で効率的であることがわかります。

于 2011-01-31T17:21:36.860 に答える