2017-06-19 8 views
1

PHP PDOでのmySQLクエリの出力を以下に示します。このオブジェクトには、2つのテーブルの複数の列が含まれ、これらの列は単一のオブジェクトに結合されます。オブジェクトのキーが不明で、オブジェクトのサブキーが既知の場合にPHPオブジェクトを割り当てる

同じテーブルの一部の行は、列parent_IDによって識別される他の行の子です。これらの子どもは、子どものように親のオブジェクトに追加する必要があります。

子供の最初の2つのレベルでこれを達成することができるのと同じくらい、私はオブジェクトの最初の層を超えてこれを達成するために別のforeachを実行することなく方法を見ることができません。

この例では、上記に明確さを追加する必要があります

foreach($components as $component){ 
    if($component->parent_ID < 0){ 
     $output->{$component->ID} = $component; 
    } 
    else if($output->{$content->parent_ID}){ 
     $output->{$content->parent_ID}->child->{$component->ID} = $component; 
    } 
    else if($output->?->child->{$conent->parent_ID}){ 
     $output->?->child->{$content->parent_ID}->child->{$component->ID} = $component; 
    } 
    } 

ない3行目にありますか?そこに通常IDがあります。これは、IDがどんなものになるかわからないからです。最初のレイヤーではparent_IDなので、この行は親の子の子を扱っているために行いました。

+0

私はあなたが木を持っていることを正しく得ましたか? – Rulisp

+0

@Rulispそれは技術用語ですか? –

+0

https://en.wikipedia.org/wiki/Tree_(data_structure) – Rulisp

答えて

1

私がコメントから理解したように、DBに多くのレコードがないと仮定すると、DBからすべての行をプリロードしてこの関数を使用してツリーを構築するのが最善の方法です

public function buildTree(array &$objects) { 
     /** thanks to tz-lom */ 
     $index = array(); 
     $relations = array(); 

     foreach($objects as $key => $object) { 
      $index[$object->getId()] = $object->setChildren(array()); 


      $relations[$object->getParentId()][] = $object; 


      if ($object->getParentId()) { 
       unset($objects[$key]); 
      } 
     } 

     foreach ($relations as $parent => $children) { 
      foreach ($children as $_children) { 
       if ($parent && isset($index[$parent])) { 
        $index[$parent]->addChildren($_children->setParent($index[$parent])); 

       } 
      } 
     } 
     return $this; 
    } 

PS本当に、私はforeachの中にforeachなしで他の方法を見ません。少なくとも、それは再帰的ではありません

+0

私は試してみましょう。おかげで –

+0

も再帰関数は木のような構造のために素晴らしいです – Kazz

+0

あなたのコメントのために@ Kazzありがとう。最初の関数には、(偶然に)作業コードで削除したコメントがあります。コード固定 – Rulisp

関連する問題