0

何が問題なのか理解できません。

私はこの配列を持っています:

array(2) {
      [0]=>
      array(4) {
        ["id"]=>
        string(1) "1"
        ["parent_id"]=>
        NULL
        ["name"]=>
        string(7) "Events"
        ["children"]=>
        array(2) {
          [0]=>
          array(3) {
            ["id"]=>
            string(1) "2"
            ["parent_id"]=>
            string(1) "1"
            ["name"]=>
            string(9) "Concerts"
          }
        }
      }
      [1]=>
      array(4) {
        ["id"]=>
        string(1) "4"
        ["parent_id"]=>
        NULL
        ["name"]=>
        string(7) "Music"
        ["children"]=>
        array(3) {
          [0]=>
          array(3) {
            ["id"]=>
            string(1) "5"
            ["parent_id"]=>
            string(1) "4"
            ["name"]=>
            string(4) "Rock"
          }
        }
      }
    }

そして、私はこの再帰関数で印刷しようとします:

public function printTree($tree) {
    $result = "";
    if(!is_null($tree) && count($tree) > 0) {
        $result .= '<ul>';
        foreach($tree as $node) {
            $result .= '<li>Cat: '.$node['name'];
                $subtree = array($node['children']);
                $this->printTree($subtree);
            $result .= '</li>';
        }
        $result .= '</ul>';
    }
    return $result;
}

「未定義のインデックス: 名前」エラーが発生します。名前を公表する必要はありますか?どうやって?配列の構文が間違っていませんか?

再帰呼び出しにコメントすると

$subtree = array($node['children']);
$this->printTree($subtree);, 

then$node['name']は未定義ではなく、コードは機能しますが、もちろん深さは 1 レベルのみです。

解決済み: (みんなありがとう!)

public function printTree($tree) {
    $result = "";
    if(is_array($tree) && count($tree) > 0) {
        $result .= '<ul>';
        foreach($tree as $node) {
            $result .= '<li>Cat: '.$node['name'];
                if (isset($node['children'])) { 
                    $result .= $this->printTree($node['children']);
                }
            $result .= '</li>';
        }
        $result .= '</ul>';
    }
    return $result;
}
4

3 に答える 3

1

$node['children']追加の配列にプッシュしています。そうすれば、このノードのサブ配列 (後で名前が付けられます) を扱うことはありませんが、配列の別のレイヤーがあります。

この配列レイヤーをスキップして、削除します。

また!is_null()、その変数を配列として使用する場合は、実際には適切なチェックではないことに注意してください。is_array()文字列やその他のスカラー値も同様に返されるため、代わりにチェックしてくださいcount>0- それらは 1 を返します。NULL のみが count=0 を返します。

于 2013-08-08T21:40:53.273 に答える
1

子ノードの printTree() への連続呼び出しによって返された結果を $result に追加する必要があります。

$result .= $this->printTree($node['children']);

:)

于 2013-08-08T22:04:29.307 に答える
1

まず第一に、$subtree-stuff をキー「children」の存在をチェックする if 条件に囲みます。現在のように、への再帰呼び出しの無限ループを作成したためですが、必要なのprintTree()はキー「子」が存在する場合は、これを行います。

$result .=第二に、の前に追加したいと思います$this->printTree($subtree);。そうしないと、戻り値は単に破棄されます。

第三に、しないでください$subtree = array($node['children']);$node['children']はすでに配列であるため、これにより配列に別のレベルが追加され、再帰が中断されます。

したがって、最終的な関数は次のようになります。

public function printTree($tree) {
    $result = '';
    if(!is_null($tree) && count($tree) > 0) {
        $result .= '<ul>';
        foreach($tree as $node) {
            $result .= '<li>Cat: '.$node['name'];
            if (isset($node['children'])) {
                $subtree = $node['children'];
                $result .= $this->printTree($subtree);
            }
            $result .= '</li>';
        }
        $result .= '</ul>';
    }
    return $result;
}

編集:おっと、そこは遅すぎました。他の人もここで3つの問題を発見しました:)

于 2013-08-08T22:08:59.347 に答える