2013-06-03 71 views
2

我不擅長遞歸從來不必處理它,但最近我需要。生成多維數組和遞歸嵌套子元的遞歸函數

我不得不遞歸生成多維數組,並找到一種方法,在這裏做到這一點:Recursive function to generate multidimensional array from database result

但是我現在還需要計算每一個兒童的父母有量,我不知道我將如何採取下面的函數來實現這個功能?

function generateCorrectArray(array $elements, $parentId = 0) { 
$branch = array(); 

foreach ($elements as $key => $element) { 
    if ($element['parent'] == $parentId) { 
     $children = generateCorrectArray($elements, $element['category_id']); 
     if ($children) { 
      $element['children'] = $children; 
     } 
     $branch[$element['category_id']] = $element; 
    } 
} 

return $branch; 
} 

EDIT

陣列I開始:

$someArray = array(
array(
    "id"=> 1, 
    "name"=> "somename1", 
    "parent"=> 0, 
    "childrenCount" => 0, 
    "children" => 0 
), 
array(
    "id"=> 53, 
    "name"=> "somename2", 
    "parent"=> 1, 
    "childrenCount" => 0, 
    "children" => 0 
), 
array(
    "id"=> 921, 
    "name"=> "somename3", 
    "parent"=> 53, 
    "childrenCount" => 0, 
    "children" => 0 
) 

電流功能結果

$someArray = array(
array(
"id"=> 1, 
"name"=> "somename1", 
"parent"=> 0, 
"children" => array(
    array(
     "id"=> 53, 
     "name"=> "somename2", 
     "parent"=> 1, 
     "children" => array(
      array(
       "id"=> 921, 
       "name"=> "somename3", 
       "parent"=> 53, 
       "children" => array(

       ) 
      ) 
     ) 
    ) 
) 
) 

我希望它也能爲每個嵌套的孩子計數。

目標

$someArray = array(
array(
"id"=> 1, 
"name"=> "somename1", 
"parent"=> 0, 
"childrenCount"=> 2, 
"children" => array(
    array(
     "id"=> 53, 
     "name"=> "somename2", 
     "parent"=> 1, 
     "childrenCount"=> 1, 
     "children" => array(
      array(
       "id"=> 921, 
       "name"=> "somename3", 
       "parent"=> 53, 
       "childrenCount"=> 0, 
       "children" => array(

       ) 
      ) 
     ) 
    ) 
) 
) 

在先進的感謝。

+0

沒有人?我猜這可能是一件困難的事情。 –

回答

0

使用遞歸數組和記錄集的問題之一是,除非您只是顯示結果,否則最終會重寫大量代碼以便能夠處理數據。 例如,如果刪除一個孩子,則必須遍歷整個數組以更新樹的其餘部分,或者編寫另一個函數來平鋪數組樹以迭代並檢索節點屬性。 如果您需要查找特定節點的深度或根節點而不僅僅是孩子的數量,會發生什麼情況?

嘗試一個對象來存儲您的樹,它可以跟蹤繼承並執行數組無法執行的功能。這將使得在試圖找出遞歸以及是否需要添加功能時使用記錄集更容易,更省時。

這是我在寫ORM之前曾經用過的例子。 http://phpfiddle.org/lite/code/u07-fnd

我設計它可以遍歷整個樹(扁平數組),單個節點或節點的子節點。我還需要孩子的數量,樹中的節點的深度(深度),以及能夠找到根節點。希望能幫助到你。

單擊右上角的運行,查看生成層次結構的方式以及如何使用它的幾個示例的結果。

+0

看起來不錯,將在未來看看它。 「 –

0

嘗試:

function generateCorrectArray(array $elements, $parentId = 0) { 
$branch = array(); 

foreach ($elements as $key => $element) { 
    if ($element['parent'] == $parentId) { 
     $children = generateCorrectArray($elements, $element['category_id']); 
     if ($children) { 
      $element['children'] = $children; 
      if(array_key_exists('childrenCount', $element)) { 
       $element['childrenCount'] = $element['childrenCount'] + 1; 
      } else { 
       $element['childrenCount'] = 1; 
      } 

     } 
     $branch[$element['category_id']] = $element; 
    } 
} 

return $branch; 
} 
+0

這似乎並不奏效。謝謝你。 –

+0

你可以粘貼一個示例輸入數組,以便我可以在我的機器上運行一些測試... –

+0

編輯與我開始的數組的主線程。 –

0
/* 
    Gets reversed array, 
    Returns multidimensional tree array. 
*/ 
function buildTree($parts) { 
    if (count($parts) == 1) { 
     return $parts[0]; 
    } 
    $last_item = array_pop($parts); 
    $last_item['childrenCount'] = count($parts); 
    $last_item['children'] = buildTree($parts); 
    return $last_item; 
} 

測試&工作:)

實施例:

$parts = array(
      array('1','2','3',5), 
      array('3','8','3',1), 
      array('1', 5,'2','3'), 
      array('D','2','3',5), 
      array('A','2','3',5) 
     ); 

var_dump(buildTree(array_reverse($parts))); 

結果:

array(6) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" [3]=> int(5) ["childrenCount"]=> int(4) ["children"]=> array(6) { [0]=> string(1) "3" [1]=> string(1) "8" [2]=> string(1) "3" [3]=> int(1) ["childrenCount"]=> int(3) ["children"]=> array(6) { [0]=> string(1) "1" [1]=> int(5) [2]=> string(1) "2" [3]=> string(1) "3" ["childrenCount"]=> int(2) ["children"]=> array(6) { [0]=> string(1) "D" [1]=> string(1) "2" [2]=> string(1) "3" [3]=> int(5) ["childrenCount"]=> int(1) ["children"]=> array(4) { [0]=> string(1) "A" [1]=> string(1) "2" [2]=> string(1) "3" [3]=> int(5) } } } } } 
+1

這實際上殺死了我的Apache,並沒有做任何事情,但是謝謝 –