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']不是未定义的并且代码可以工作,但当然只有一层深度。

已解决:(谢谢大家!)

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

您必须将子节点的连续调用 printTree() 返回的结果附加到 $result。

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

:)

于 2013-08-08T22:04:29.307 回答
1

首先,您想将 $subtree-stuff 包含在一个 if 条件中,以检查是否存在键“children”,因为现在,您已经创建了一个递归调用的无限循环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;
}

编辑:哎呀,那里太慢了,其他人也在这里发现了三个问题:)

于 2013-08-08T22:08:59.347 回答
1

您正在推$node['children']入一个额外的阵列。这样你就不会处理这个节点的子数组(稍后会有一个名字),但是你有另一层数组。

跳过这个数组层,删除它。

另请注意,!is_null()如果您想将该变量用作数组,这并不是一个很好的检查。改为检查is_array(),因为字符串和其他标量值也会返回count>0- 它们返回 1。只有 NULL 返回 count=0。

于 2013-08-08T21:40:53.273 回答