2016-04-23 36 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' 
      ) 
     ) 
     ) 
    ), 
    ... 
    ... 
) 

對於我使用下面的算法(取嵌套級別= 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; 

爲t他的功能會給我想要的結果,但我無法控制深層嵌套。如果必須獲取訂單100的嵌套級別,我必須編寫foreach循環內部foreach循環100次。此外,我不知道這個策略的表現是否合理。

有誰知道我們如何解決這個更具戰略性的?也許與& foreach循環相結合,不涉及嵌套foreach循環?

+0

林不熟悉MongoDB的行爲,但犯規如果您的查詢它返回一個數組? – DevDonkey

+0

我編輯了我的答案,我相信它會在這裏爲你做好工作。 – Webeng

+0

你真的要自己建樹嗎?如果你有一個單獨的父文檔,你可以直接從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 == 0add_two()函數將不再被調用,並且結果將被獲得。

同樣,你可以用你的代碼做同樣的事情。如果您可以在自己內部調用它,則沒有理由再次重寫相同的函數。

讓我知道,如果這是你要找的人:)