2012-06-14 43 views
0

我有,我有孩子的父母,子女,孩子,孩子的孩子儿童等等等等填充数组。然而,我似乎无法弄清楚如何在不需要编写每个关卡的情况下尽可能多地创建关卡。PHP Array添加无论儿童?

首先现在我有

foreach($this->tree as $k=>$v) { 
    if($v['id'] == $i['pid']) { 
     // Add children 
     $this->tree[$k]['children'][] = array('name'=>$i['name'],'id'=>$i['id']); 
     break; 
    }else{ 
     foreach($v['children'] as $kc=>$vc) { 
     $this->tree[$k]['children'][$kc]['children'][] = array('name'=>$i['name'],'id'=>$i['id']); 
     } 
    } 
} 

产生的东西,看起来像

Array 
(
    [0] => Array 
     (
      [name] => Test 
      [id] => 1 
      [children] => Array 
       (
        [0] => Array 
         (
          [name] => Test2 
          [id] => 2 
          [children] => Array 
           (
            [0] => Array 
             (
              [name] => Test 3 
              [id] => 3 
             ) 

           ) 

         ) 

       ) 

     ) 

); 

但我似乎无法弄清楚如何做的是没有写出一个十亿foreach循环。

$ i就是一个四行,ID,PID(父ID),名称和重量。

+0

[递归函数的可能的复制产生从数据库结果多维数组](http://stackoverflow.com/questions/8587341/recursive-function-to-generate-multidimensional-array-from-database-result)。递归,weeee〜! – deceze

+0

'$ i'是怎么样的? – SuperSaiyan

+1

通常对于那样的树结构,您将需要使用递归函数。 – robbrit

回答

1

正如其他人所说,这是很好的了解遍历树递归函数。

为了让你开始递归函数:

function walkRecursive($element) { 
    if($element['id'] == $i['pid']) { 
     // add your stuff 
     break; 
    } 
    if(isset($element['children'])) { 
     foreach($element['children'] as $child) { 
      walkRecursive($child); 
     } 
    } 
} 

walkRecursive($this->tree); 

或者,你想看看标准的PHP函数array_walk_recursive

http://php.net/manual/en/function.array-walk-recursive.php

0

你需要一个递归函数来实现这一目标。也就是说,一个函数或类方法遍历项目的扁平列表中的每个项目并组装一个新的多维列表,在自身内部调用自己以添加子项,然后添加子项的子项,等等听起来令人困惑?如果您搜索它,在线有很多文档。