2010-06-02 187 views
1

我想創建一個函數,它返回從設置節點返回到根值的完整路徑。我試圖做一個遞歸函數,但完全沒有運氣。什麼是適當的方式來做到這一點?我認爲遞歸函數是唯一的方法?PHP:遞歸數組函數

這裏的數組:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [name] => Root category 
      [_parent] => 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [name] => Category 2 
      [_parent] => 1 
     ) 

    [2] => Array 
     (
      [id] => 3 
      [name] => Category 3 
      [_parent] => 1 
     ) 

    [3] => Array 
     (
      [id] => 4 
      [name] => Category 4 
      [_parent] => 3 
     ) 
) 

我希望我的函數輸出得到4的節點ID#完整路徑時,其結果是:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [name] => Root category 
      [_parent] => 
     ) 

    [1] => Array 
     (
      [id] => 3 
      [name] => Category 3 
      [_parent] => 1 
     ) 

    [2] => Array 
     (
      [id] => 4 
      [name] => Category 4 
      [_parent] => 3 
     ) 
) 

我的遞歸技能出了名的壞榜樣:

function recursive ($id, $array) { 

     $innerarray = array(); 
     foreach ($array as $k => $v) { 

      if ($v['id'] === $id) { 
       if ($v['_parent'] !== '') { 
        $innerarray[] = $v; 
        recursive($v['id'], $array); 
       } 
      } 

     } 
     return $innerarray; 
    } 
+1

爲什麼不發表你的代碼,所以我們可以看看?也許你比你想象的更接近。 – FrustratedWithFormsDesigner 2010-06-02 18:26:40

+0

更新了帖子! – Industrial 2010-06-02 18:41:14

+1

沒有必要使用遞歸。將您的'foreach'搜索添加到我的下面的代碼中以搜索父ID。如果你必須使用遞歸,你的代碼的問題是你沒有保留遞歸函數的返回值,你需要將它附加到你的$ innerarray – Oliver 2010-06-02 18:54:27

回答

4

假設你的子數組中的「id」是子數組index + 1在父數組中你可以這樣做:

$searchNode = 4; 
while ($searchNode) 
{ 
    $result[] = $nodes[$searchNode - 1]; 
    $searchNode = $nodes[$searchNode - 1]["id"]; 
} 
$result = array_reverse($result); 
+0

請注意,這不會檢查循環或其他錯誤索引。 – Oliver 2010-06-02 18:39:58