2016-06-25 7 views
1

最初のネストされた木の子供を取得し、このように見えること(のはentriesそれを呼びましょう):私はテーブルを持っている

:ツリーとして

id parent_id 
1 0 
2 1 
3 2 
4 1 
5 4 
6 5 
7 4 
8 1 

、これは(数はidである)、このようになります

- 1 
    - 2 
     - 3 
    - 4 
     - 5 
      - 6 
     - 7 
    - 8 

これらのIDの配列を、最も内側の子から始まり、上に向かって作業したいと考えています。

出力は次のようになります。

[3, 2, 6, 5, 7, 4, 8, 1] 

私はLaravel 5.2を使用しています。

+1

このツリーの背後にある論理は何ですか?あなたの質問はかなり曖昧であるようです。あなたはこれまでに何を試みましたか?あなたの試みを投稿してください –

+0

私はこれを論理的にやってどうやって行くのか分かりません。これまでに私がしてきたのは '$ results = Entry :: all();'です。 – user6383193

+0

これは良い論理ですが、これについてもっと説明する必要があります。 – C2486

答えて

1

あなたがしようとしているのはdepth first in order traversalです。葉がないノードに到達するまで、各親ノードの葉ノードを繰り返して反復することで実現できます。

このデータをPHPに保存するために使用しているデータ構造によっては、アプローチが異なる場合があります。例えば、配列(以下の例のような)を使用すると、次のようになります...

$tree = [ 
    1 => [ 
     2 => [ 
      3 => [], 
     ], 
     4 => [ 
      5 => [ 
       6 => [], 
      ], 
      7 => [], 
     ], 
     8 => [], 
    ] 
]; 


function depthFirstTraversal(Array $nodes) { 
    foreach($nodes as $node => $children) { 
     if (!$children) { 
      return $node; 
     } 
     echo depthFirstTraversal($children); 
     echo $node; 
    } 
} 

depthFirstTraversal($tree); 

//Output would be 32657481 

オブジェクトは、ノードを指定しますが、同様に、オブジェクトと同じことを行うことができます値と子配列を親ノードとして使用し、子をその値として上記のように使用する代わりに、プロパティとして使用します。

+0

私は大学でこれについて学んだ、私は理論の名前を思い出しようとしていた。 – C2486

+0

配列として出力する必要があります。 – user6383193

+0

結果を直接出力するのではなく、その関数から配列を返すことができます。 'echo'を配列プッシュで置き換え、配列に沿って渡します:) – Sherif

関連する問題