2017-03-21 2 views
0

私は、それよりも長い間waaaayのために私を忙しくしている状況があります。私は、データベーステーブルからアイテムのツリーを構築したい。次の表を参考にしてください。親データベースの項目を逆戻りして返す

| id | name | parent | 
|----|---------|--------| 
| 1 | Root | 0  | 
| 2 | Child | 1  | 
| 3 | Child 2 | 2  | 
| 4 | Child 3 | 3  | 

与えられた開始点から親が残っていない状態になるまで再帰的に横断する関数が必要です。それがうまくいくと思ったのは以下のことですが、そうではありません。 whileループはゼロで停止しません。

public function getChildren($parent, $output = array()){ 
    $folder = [select name, parent from table]; 
    array_push($output, $folder->name); 
    $newParent = $folder->parent; 
    while($newParent >= 0){ 
      self::getChildren($newParent, $output); 
    } 
} 

何を私はif()/else()建設のためwhile()ループを交換する際の作業がありますが、私は私が必要とするクラスのコンテキストにいるので、私は応答

if($newParent != 0){ 
    self::getChildren($newParent, $output); 
}else{ 
    return array_reverse($output); 
} 

を返すの問題に実行するん木が構築された後に値を返すために、それに基づいて、私はwhile()ループが必要であると仮定し、その後に応答を返します。しかし、私はそれを働かせることはできません。

また、最初はwhile($newParent <= 0){を使用しましたが、これも機能しませんでした。

私の期待される結果は次のようになります。

print_r(getChildren(3)); 

// response: 
Array 
(
    [0] => Root 
    [1] => Child 
    [2] => Child 2 
    [3] => Child 3 
) 
+0

_ _「私はすべきメーリングリストの長く忙しい私を保つの状況を持っています」 PHP/MySQLと組み合わされた "ネストされたセット"として、これに対処するための十分なリソースがあるはずです。 – CBroe

+0

'while $ newParent> = 0' '$ newParent'がゼロでない場合(最初に子を見つけたことを確認するので)、変更するものはありません。それ自身のローカル変数を保持しているので、その最初のリクエストの '$ newParent'は再帰呼び出しの後でも> = 1になります。もし"参照渡し "の場合、それはそうではありません –

+1

@CBroeありがとう私を正しい方向に向ける!私はこれらの言葉を考え出すことはなかった。この記事の助けを借りて作業しました:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ – Maurice

答えて

0

私はPHP PDOでFETCH_LAZY接続設定を使用することをお勧めします。それはまさにあなたが探しているものかもしれません(しかし、プレビルドと軽量)。それはあなたがたときに、車輪を再構築し、発生する可能性が...このような検索キーワードを使用して -

Manual for Fetch Modes

PHP - PDO DB connection

関連する問題