0

我有一个数组,我填充了父母、孩子、孩子的孩子、孩子的孩子的孩子等等。但是,我似乎无法弄清楚如何为尽可能多的级别做到这一点,而不必写出每个级别。

首先现在我有

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)、name 和 weight。

4

2 回答 2

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

于 2012-06-14T13:48:32.333 回答
0

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

于 2012-06-14T13:39:06.097 回答