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
                                        )

                                )

                        )

                )

        )

);

しかし、10億のforeachループを書き出さずに、その方法を理解することはできないようです。

$ iは、id、pid(親ID)、名前、および重みの4つの行です。

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 に答える