2016-04-23 16 views
2

この質問は必ずしもPHPやMongoDBに関連するものではありません。PHPでネストされた配列を取得するアルゴリズム

私はカテゴリのMongoDBデータベースを持っています。コレクションです。コレクション内のドキュメントが

{ 
title : 'Parent 1', 
cat_id : '_ABC1', 
level : 1 
} 
{ 
title : 'Parent 2', 
cat_id : '_ABC2' 
level : 1 
} 
{ 
title : 'Child 1', 
cat_id : '_ABC1_CEF1' 
level : 2 
} 
{ 
title : 'Child 2', 
cat_id : '_ABC1_CEF2' 
level : 2 
} 
{ 
title : 'Child Child 1', 
cat_id : '_ABC1_CEF1_GHI1' 
level : 3 
} 
{ 
title : 'Child Child 2', 
cat_id : '_ABC1_CEF1_GHI2' 
level : 3 
} 

Nesting 以下のように見える、私はPHPでやりたいと、その私が使用しています次のアルゴリズムについては

$array = array(
    array(
     'title' => 'Parent 1', 
     'cat_id' => '_ABC1', 
     'sub' => array(
      'title' => 'Child 1', 
      'cat_id' => '_ABC1_CEF1', 
      'sub' => array(
       array(
       'title' => 'Child Child 1', 
       'cat_id' => '_ABC1_CEF1_GHI1' 
      ), 
       array(
       'title' => 'Child Child 2', 
       'cat_id' => '_ABC1_CEF1_GHI2' 
      ) 
     ) 
     ) 
    ), 
    ... 
    ... 
) 

のようなネストされた配列(複数可)(入れ子のレベルを取得する取得されTと= N) (N深い配列がフェッチなければならない方法、イテレータを指示フェッチパラメータの数である)

$array_holder = array(); 

foreach(MongoGetLevel1Cats as $parent){ 
    $parent['sub'] = array(); 

    foreach(MongoGetLevel2Cats as $child){ 
     $child['sub'] = array(); 

     foreach(MongoGetLevel3Cats as $child_child){ 
      $child_child['sub'] = array(); 

      ... 
      ... 

      array_push($child['sub'], $child_child); 
     } 

     array_push($parent['sub'], $child); 
    } 

    array_push($array_holder, $parent); 
} 

Return $array_holder; 

彼の機能は私に望みの結果を与えるだろうが、私は深いネストされたレベルを制御することはできない。入れ子にされたレベル100をフェッチする必要がある場合は、foreachループinsiderループを100回書く必要があります。また、私はこの戦略が良いかどうか賢明なパフォーマンスを知りません。

私たちはこれをより戦略的にどのように解決しているのでしょうか?おそらく&のforeachループでは、foreachループを入れ子にすることを伴わない組み合わせがありますか?

+0

イムを探していたものであるならば、私に教えてください、しかし、あなたはそれを照会する場合、それは、配列を返すdoesntの? – DevDonkey

+0

私は私の答えを編集しました、私はそれがあなたのためにここでうまくいくと信じています。 – Webeng

+0

本当に木を自分で作る必要がありますか?単一の親のために1つのドキュメントを持っていれば、MongoDBから直接ネストされた構造体をフェッチすることができます。 –

答えて

0

コールバック関数を使用できます。例:前の例では

function add_two($result, $how_many_times) 
{ 
    $result = $result + 2;//adds 2 
    echo "current =".$result."<br>"; 
    $how_many_times--; 
    if ($how_many_times>0) 
    { 
    $result = add_two($result, $n); 
    } 
    return $result; 
} 

$resultVar = add_two(5, 5);//should give 15... 

echo "resultvar = ".$resultVar."<br>";//outputs: resultvar = 15 

、私は自分自身の内側に同じ機能add_two()を置いていると私が望むどのように多くの反復見て、条件を作成しました。私が一度反復するたびに、私は$how_many_timesから1つの値を引きます。 $how_man_times == 0になると、add_two()関数は呼び出されなくなり、結果が得られます。

同様に、コードで同じことを行うことができます。あなたがそれ自身の内部でそれを呼び出すことができれば、同じ関数をもう一度書き直す必要はありません。

は、これはあなたがMongoDBの行動に慣れていない:)

関連する問題