代码之家  ›  专栏  ›  技术社区  ›  noah

PHP-数组引用树,第一次追加到新数组时丢失

  •  0
  • noah  · 技术社区  · 15 年前

    我有一个由嵌套的关联数组组成的树结构。我有一组要添加到树中的路径,其中路径中的每个元素都是节点的名称。下面的代码应该在“a”下创建节点“2”(它确实这样做了),并在“2”下创建节点“i”、“ii”和“iii”。但是由于某种原因,在“2”下创建的第一个节点会丢失。它会打印出它正在被创造,但是 print_r 只显示“ii”和“iii”。

    $tree = array(
        name => 'root',
        children => array(
            array(
                name => 'a',
                children => array( ),
            ),
        ),
    );
    
    
    $paths = array(
        array('a','2','i'),
        array('a','2','ii'),
        array('a','2','iii'),
    );
    
    
    foreach ($paths as $path) {
        $node =& $tree;
        $found = true;
        while($found && count($path) > 0) {
            $name = $path[0];
            $found = false;
            echo "looking for $name\n";
            foreach ($node['children'] as &$child) {
                if($name == $child['name']) {
                    echo "found $name\n";
                    $node =& $child;
                    $found = true;
                    break;
                }
            }
            if($found) {
                array_shift($path);
            }
        }
        if(!$found) {
            echo "didn't find $name\n";
            while(count($path) > 0) {
                $name = array_shift($path);
                echo "creating $name in ".$node['name']."\n";
                $newNode = array(
                    'name' => $name,
                    'children' => array(),
                );
                $node['children'][] = $newNode;
                $node =& $newNode;
            }
        }
    }
    
    print_r($tree);
    

    我怀疑问题与我如何初始化“2”的子级有关,因为它将在循环内创建,但我不知道我做错了什么。

    编辑:所以我想办法让它发挥作用。。。将最后一个内部循环更改为:

            $newNode = array(
                'name' => $name,
                'children' => array(),
            );
            $node['children'][] = $newNode;
            $node =& $newNode;
    

            $children =& $node['children'];
            $children[] = array(
                'name' => $name,
                'children' => array()
            );
            $node =& $children[count($children)-1];
    

    似乎是这样,但我不知道为什么。应该有一个很好的解释。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Hamish    15 年前

    所有这些参考文献都在伤害我的大脑,但是我可以看到一个明显的错误:

    $node['children'][] = $newNode;
    $node =& $newNode;
    

    第二行覆盖 $node 参考 $newNode ,因此第一行未使用。

    $children 数组,进行操作,然后设置 $节点

    推荐文章