PHP数组添加无论儿童?

时间:2012-06-14 13:23:26

标签: php

我有一个阵列,我与父母,孩子,孩子的孩子,孩子的孩子等等一起居住。但是我似乎无法弄清楚如何在不必写出每个级别的情况下执行更多级别的操作。

首先我有

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),名称和权重。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您需要一个递归函数来完成此任务。也就是说,一个函数或类方法遍历项目的平面列表中的每个项目并组装一个新的多维列表,在其自身内部调用以添加子项,然后添加子项的子项,等等听起来很混乱?如果你搜索它,网上有很多文档。