2012-02-15 104 views
2

我有一个类别数组,其中id是类别的id,parent表示该类别的父级id(id 0表示最上面的父节点),value是阵列。路径最初设置为类别的ID。该阵列如下:没有分配给变量的值

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [parent] => 0 
      [value] => Corporate Files 
      [path] => 1 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [parent] => 0 
      [value] => Products Files 
      [path] => 2 
     ) 

    [2] => Array 
     (
      [id] => 3 
      [parent] => 1 
      [value] => Communications Materials 
      [path] => 3 
     ) 

    [3] => Array 
     (
      [id] => 4 
      [parent] => 1 
      [value] => Group Technical 
      [path] => 4 
     ) 

    [4] => Array 
     (
      [id] => 5 
      [parent] => 1 
      [value] => New Projects 
      [path] => 5 
     ) 

    [5] => Array 
     (
      [id] => 6 
      [parent] => 2 
      [value] => Product Range 
      [path] => 6 
     ) 

    [6] => Array 
     (
      [id] => 7 
      [parent] => 2 
      [value] => WL4 
      [path] => 7 
     ) 
); 

我想生成数组中的类别路径。所以输出应该是

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [parent] => 0 
      [value] => Corporate Files 
      [path] => 1 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [parent] => 0 
      [value] => Products Files 
      [path] => 2 
     ) 

    [2] => Array 
     (
      [id] => 3 
      [parent] => 1 
      [value] => Communications Materials 
      [path] => 1,3 
     ) 

    [3] => Array 
     (
      [id] => 4 
      [parent] => 1 
      [value] => Group Technical 
      [path] => 1,4 
     ) 

    [4] => Array 
     (
      [id] => 5 
      [parent] => 1 
      [value] => New Projects 
      [path] => 1,5 
     ) 

    [5] => Array 
     (
      [id] => 6 
      [parent] => 2 
      [value] => Product Range 
      [path] => 2,6 
     ) 

    [6] => Array 
     (
      [id] => 7 
      [parent] => 2 
      [value] => WL4 
      [path] => 2,7 
     ) 
); 

我写了下面的函数。

function findparent($id,$path){ 
     global $categories; 
     global $catcnt; 

     if($id==0){ 
      echo $path."<br />"; //this outputs path currently 
      return $path; 
     } 
     for($i=0;$i<$catcnt;$i++){ 

      if($id==$categories[$i]['id']){ 
       $path=$id.",".$path; 
       findparent($categories[$i]['parent'],$path); 
      } 
     } 
    } 

for($i=0;$i<count($categories);$i++){ 
      $categories[$i]['path']=(string)findparent($categories[$i]['parent'],$categories[$i]['id']); //this doesnt assign it currectly 

    } 

,输出是:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [parent] => 0 
      [value] => Corporate Files 
      [path] => 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [parent] => 0 
      [value] => Products Files 
      [path] => 
     ) 

    [2] => Array 
     (
      [id] => 3 
      [parent] => 1 
      [value] => Communications Materials 
      [path] => 
     ) 

    [3] => Array 
     (
      [id] => 4 
      [parent] => 1 
      [value] => Group Technical 
      [path] => 
     ) 

    [4] => Array 
     (
      [id] => 5 
      [parent] => 1 
      [value] => New Projects 
      [path] => 
     ) 

    [5] => Array 
     (
      [id] => 6 
      [parent] => 2 
      [value] => Product Range 
      [path] => 
     ) 

    [6] => Array 
     (
      [id] => 7 
      [parent] => 2 
      [value] => WL4 
      [path] => 
     ) 
); 

我要去哪里错了?

+0

我想你会在'findparent'函数内出错。另请参见我对[根据父ID值将数组从一个数据转换为多维]的回答(http://stackoverflow.com/a/7768445/367456),它类似并显示/说明如何收集数据。 – hakre 2012-02-15 15:10:27

回答

2

findparent仅当id为零时才返回。

在递归调用findparent之前,您需要第二个return语句。

+0

谢谢tonne :) – 2012-02-15 15:21:15

1

当你不需要处理多层次,它自己的功能是一个有点开销,你可以在阵列本身上直接运行一个简单的foreach

foreach ($array as &$node) 
{ 
     if ($node['parent']) 
     { 
       $node['path'] = $node['parent'] . ',' . $node['path']; 
     } 
} 
unset($node); 

然而,你可以把它放到它自己的函数中,但是就我所见,你不需要任何全局变量。

你在这里看到的是简单的字符串连接,这使得你写的数组就像你想要的那样。我的第一条评论意味着更深入地管理这个结构,而不是一个深度。 Demo