[PHP Tree Class] ik kan maar 2 levels 'diep'

Pagina: 1
Acties:

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 09-09 14:51

thomaske

» » » » » »

Topicstarter
Hallo, beetje vage topictitle maarja..

Ik ben dus bezig met een klasse om een 'boom' aan gegevens in op te slaan.
dit is de class:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
class Tree {

    var $nodeID;
    var $name;
    var $children;

    function Tree($nodeID,$name) {
        $this->nodeID = $nodeID;
        $this->name = $name;

        $this->children = array();
    }

    function addNode($nodeID, $name) {
        $this->children[$nodeID] = new Tree($nodeID, $name);
        return $this->children[$nodeID];
    }
}
?>

Het is nog erg basic, en gaat er nu ook alleen nog maar om, om de boom goed op te bouwen.

Het toevoegen van Nodes lukt al wel, maar zodra ik een node ga toevoegen aan een zojuist toegevoegde node, dan is deze alleen in de laatste node te zien en niet in de hele boom.

bijvoorbeeld:
ik wil deze boom hebben
code:
1
2
3
4
5
root
  |-> test.1
      |-> test.1.1
      |-> test.1.2
  |-> test.2

dat doe ik met deze code:
PHP:
1
2
3
4
5
6
7
8
<?
$tree = new Tree(0,"root");

$node1 = $tree->addNode(1,"test.1");
$node3 = $node1->addNode(3,"test.1.1");
$node4 = $node1->addNode(4,"test.1.2");
$node2 = $tree->addNode(2,"test.2");
?>

en als ik tree bekijk komt het er zo uit te zien:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
tree Object
(
    [nodeID] => 0
    [name] => root
    [children] => Array
      (
        [1] => tree Object
            (
              [nodeID] => 1
              [name] => test.1
              [children] => Array ()
            )
        [2] => tree Object
            (
              [nodeID] => 2
              [name] => test.2
              [children] => Array ()
            )
      )
)

nu mis ik dus test.1.1 en test.1.2 deze staan wel opgeslagen in $node1, maar ik wil dus dat het één grote boom wordt.

--> beetje lange inleiding, maar dan nu de vraag: ;)
Waar maak ik de denkfout. Zit de klass niet goed inelkaar of maak ik de boom verkeerd aan? Alvast bedankt! :* :)

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Wat is de code waarmee je de tree print?

[edit]
zal wel gewoon print_r zijn?

ik denk dat ik de fout al zie.
PHP:
1
2
3
4
5
6
7
<?
function addNode($nodeID, $name) 
{        
    $this->children[$nodeID] = new Tree($nodeID, $name);        
    return $this->children[$nodeID];    
}
?>

je return't hier een kopie van het object. ik denk dat je &$this->children[$nodeID] moet gebruiken. een referentie dus.

zie http://php.nederland.net/manual/en/language.references.php

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 09-09 14:51

thomaske

» » » » » »

Topicstarter
Op zondag 03 februari 2002 13:56 schreef marcusk het volgende:
Wat is de code waarmee je de tree print?

zal wel gewoon print_r zijn?

je return't hier een kopie van het object. ik denk dat je &$this->children[$nodeID] moet gebruiken. een referentie dus.
inderdaad met print_r!

die & ervoor werkt niet direct, maar daar ligt wel het probleem denk ik. Ik ga ermee aan de slag! bedankt! :)

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • Grum
  • Registratie: Juni 2001
  • Niet online
Code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?
class Tree {
        var $nodeID;
        var $name;
        var $children;
 
        function Tree($nodeID,$name) {
                $this->nodeID   = $nodeID;
                $this->name     = $name;
                $this->children = array();
        }
 
        function &amp;addNode($nodeID, $name)
        {
                $this->children[$nodeID] = new Tree($nodeID, $name);
                return $this->children[$nodeID];
        }
}
?>

Testcode:
PHP:
1
2
3
4
5
6
7
8
9
<?
$tree  = new Tree(0,"root");
$node1 =&amp; $tree->addNode(1,"test.1");
$node3 =&amp; $node1->addNode(3,"test.1.1");
$node4 =&amp; $node1->addNode(4,"test.1.2");
$node2 =&amp; $tree->addNode(2,"test.2");

print_r($tree);
?>

Resultaat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
tree Object
(
    [nodeID] => 0
    [name] => root
    [children] => Array
      (
        [1] => tree Object
            (
              [nodeID] => 1
              [name] => test.1
              [children] => Array
                (
                    [3] => tree Object
                      (
                        [nodeID] => 3
                        [name] => test.1.1
                        [children] => Array
                            (
                            )
                      )
                    [4] => tree Object
                      (
                        [nodeID] => 4
                        [name] => test.1.2
                        [children] => Array
                            (
                            )
                      )
                )
            )
        [2] => tree Object
            (
              [nodeID] => 2
              [name] => test.2
              [children] => Array
                (
                )
            )
      )
)

alstu

changepunten:

1/ functie addNode MOET een reference returnen (dat impliceer je dmv van een & voor de function name)
2/ de assignment moet dan dmv een non-copy gaan (=&)

info: http://php.nederland.net/manual/en/language.references.return.php

HTH :P

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

grum + 3 behulpzaam :)

Doet iets met Cloud (MS/IBM)


  • Grum
  • Registratie: Juni 2001
  • Niet online
[/ot] ik had natuurlijk ook UTFM kunne tikken ;)

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 09-09 14:51

thomaske

» » » » » »

Topicstarter
Oke! het werkt (natuurlijk).

Bedankt! :*

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Op zondag 03 februari 2002 16:02 schreef Grum_ een boel code:
Grappig ik gebruik bijna het zelfde code om een mijn XML te maken. :)

Programmer - an organism that turns coffee into software.

Pagina: 1