PHP - Dizi Kaynaklar Ağacı, önce yeni bir diziye eklenecek kaybolur

0 Cevap php

Ben iç içe ilişkisel diziler oluşan bir ağaç yapısı vardır. Ben yolda her öğe bir düğümün adıdır ağacı, eklemek istediğiniz yolları bir dizi var. Aşağıdaki kodu (öyle) "a" altında düğüm "2" oluşturmak ve düğümleri "2" altında "i", "ii" ve "iii" oluşturmanız gerekir. Nedense olsa da, "2" altında oluşturulan ilk düğüm kaybolur. Bu yaratılan varlık olduğunu basacaktır, ancak print_r sadece "ii" ve "iii" gösteriyor.

$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);

Ben sorun döngü içinde oluşturulan olacağından nasıl, "2" çocukları başlatılıyor kulüpler ile ilgisi var sanıyorum, ama ben yanlış yapıyorum bilmiyorum.

EDIT: Bu yüzden o son iç döngü ... Değişen iş yapmak nasıl anladım:

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

karşı

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

seems karşı do it, but I'm not sure why. A good explanation is due.

0 Cevap