2011-09-02 46 views
2

讓我解釋我的問題。我嘗試生成一個類別數組。值不遞推遞歸陣列

這是我的功能。

private function recursiveCategoriesTree($id_parent, $level, $categories) 
{ 
    $tree = array(); 

    foreach($categories as $categorie) 
    { 
     if($id_parent == $categorie['id_parent']) 
     {   
      $tree[$level][] = $categorie; 
      $this->recursiveCategoriesTree($categorie['id_category'], ($level+1), $categories); 
     }   
    } 

    return $tree;  

} 

當我追蹤回聲的循環,似乎一切工作,所有父類和女孩都包括在內,但不推入陣列。

這裏是我的類別

array( 
[0] => Array 
    (
     [id_category] => 4 
     [name] => Pièces détachées 
     [id_parent] => 1 
    ) 

[1] => Array 
    (
     [id_category] => 5 
     [name] => Excavateur 
     [id_parent] => 4 
    ) 

[2] => Array 
    (
     [id_category] => 6 
     [name] => série 100 
     [id_parent] => 5 
    ) 

[3] => Array 
    (
     [id_category] => 7 
     [name] => above 
     [id_parent] => 6 
    ) 

[4] => Array 
    (
     [id_category] => 8 
     [name] => système hydraulique 
     [id_parent] => 7 
    ) 

[5] => Array 
    (
     [id_category] => 9 
     [name] => série 200 
     [id_parent] => 5 
    ) 

[6] => Array 
    (
     [id_category] => 10 
     [name] => thru 
     [id_parent] => 6 
    ) 

[7] => Array 
    (
     [id_category] => 11 
     [name] => Compaction 
     [id_parent] => 4 
    ) 
) 

這裏產生

Array(
[0] => Array 
    (
     [0] => Array 
      (
       [id_category] => 5 
       [name] => Excavateur 
       [id_parent] => 4 
      ) 

     [1] => Array 
      (
       [id_category] => 11 
       [name] => Compaction 
       [id_parent] => 4 
      ) 

    ) 
) 

print_r的結果print_r我打電話給我的功能一樣,

$tree = $this->recursiveCategoriesTree(4, 0, $categories) 

問題是什麼?謝謝你=)

回答

2

無論是從您的遞歸調用得到的返回值和推送到陣列上,或者創建一個名爲tree類的私有財產,將值壓是代替。你沒有通過遞歸函數調用傳遞變量$tree

E.g.如果你這樣做,將工作:(編輯:固定... [再次])

private $catTree = array(); 
private $catStartLevel = FALSE; 

private function recursiveCategoriesTree($id_parent, $level, $categories) { 

    if ($this->catStartLevel !== FALSE) $this->catStartLevel = $level; 

    foreach($categories as $categorie) {  

     if($id_parent == $categorie['id_parent']) {   

     $this->catTree[$level][] = $categorie; 
     $this->recursiveCategoriesTree($categorie['id_category'], ($level+1), $categories); 

     }   

    } 

    if ($this->catStartLevel === $level) { 

     $tree = $this->catTree; 
     $this->catTree = array(); 
     $this->catStartLevel = FALSE; 

    } 

    return $tree;  

} 

...然而,這是不是很大,因爲你現在在你的類中的「無意義」私有財產。你會更好地改變你的陣列結構,並從$this->recursiveCategoriesTree()趕上返回值...

編輯

關於它的思考,如果你真的想在該結構中的數組,你可能會更好傳遞變量與陣列by reference填充:

private function recursiveCategoriesTree($id_parent, $level, $categories, &$tree) { 

    foreach($categories as $categorie) {  

     if($id_parent == $categorie['id_parent']) {   

     $tree[$level][] = $categorie; 
     $this->recursiveCategoriesTree($categorie['id_category'], ($level+1), $categories, $tree); 

     }   

    } 

} 

...然後你會這樣稱呼它......

$myTree = array(); 
$obj->recursiveCategoriesTree($id_parent, $level, $categories, $myTree); 
print_r($myTree); 
+0

它的工作原理。的確,通過將類變量全局化爲類樹......它的工作原理=)非常感謝! –

2

recursiveCategoriesTree()返回$tree,但你沒有做任何與該返回值的東西,當你遞歸地調用該方法。您只將最初調用返回的$tree存儲到方法中。

也許你想要這樣的東西?

$categorie['children'] = $this->recursiveCategoriesTree($categorie['id_category'], ($level+1), $categories); 
+0

我需要生成類似的東西:數組[等級] [N] 水平只取決於父母。 此外,我試過你的方法,並且子Array是空的 –

+0

感謝您的幫助。 –

0

在將類別附加到樹之前,您應該首先獲取某個類別的所有子元素,並將其添加到其數組中。有點像這樣:

foreach($categories as $categorie) 
{ 
    $categorie['childs'] = $this->recursiveCategoriesTree($categorie['id_category'], ($level+1), $categories); 
    $tree[$level][] = $categorie; 
} 
+0

感謝您的幫助。 –