[php] boomstructuur/array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
hallo, ik heb de volgende klasse voor een node-object in een boom:


PHP:
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
var $id;    // unique id of this node in the database
var $pid;   // parent id of the currect node
var $name;  // string name of this hierarchy node
var $nodes; // child nodes of this hierarchy node
var $level; // level in the total hierarchy
var $size;  // number of sub nodes

class hierarchynode
{
    function hierarchynode( )
    {
        $this->id    = -1;
        $this->pid   = -1;
        $this->name  = "";
        $this->nodes = array( );
        $this->level = 0;
        $this->size  = 0;
    }

    function push( &$node )
    {
        $this->nodes[$this->size] = &$node;
        $this->size++;
    }

    ..... plus nog meer functies
}


nu creeer ik daarna een nodestructuur waardoor er uiteindelijk voor de root node een structuur als volgt ontstaat (print_r( $hierarchy ) ):

PHP:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
hierarchynode Object
(
    [id] => 1
    [pid] => 0
    [name] => 1
    [nodes] => Array
               (
                   [] => hierarchynode Object
                         (
                             [id] => 2
                             [pid] => 1
                             [name] => 1.2
                             [nodes] => Array
                                        (
                                             [] => hierarchynode Object
                                                   (
                                                       [id] => 5
                                                       [pid] => 2
                                                       [name] => 1.2.5
                                                       [nodes] =>
                                                       [level] => 2
                                                       [size] =>
                                                   )
                                                  
                                            [1] => hierarchynode Object
                                                   (
                                                       [id] => 6
                                                       [pid] => 2
                                                       [name] => 1.2.6
                                                       [nodes] =>
                                                       [level] => 2
                                                       [size] =>
                                                   )
                                        )
                             [level] => 1
                             [size] => 2
                         )

                   [1] => hierarchynode Object
                          (
                              [id] => 3
                              [pid] => 1
                              [name] => 1.3
                              [nodes] =>
                              [level] => 1
                              [size] =>
                          )
                          
                   [2] => hierarchynode Object
                          (
                              [id] => 4
                              [pid] => 1
                              [name] => 1.4
                              [nodes] =>
                              [level] => 1
                              [size] =>
                          )
                )

    [level] => 0
    [size] => 3
)


dit eigenlijk alleen even ter verduidelijking van de opzet.
hjet gaat om het toevoegen (pushen) van de node objecten. zoals jullie zien gebeurt dit door er achteraan een toe te voegen en de size met 1 te verhogen.

echter in de print_r van het array zie je dat het eerste sub-node object geen index heeft, dus een index [] ipv [0]. hoe kan dit voorkomen. ik kan het echt nergens in plaatsen. het is dus nodig ivm het doorlopen van de subnodes in een for-lusje. nu krijg ik dus een: Fatal error: Call to a member function on a non-object in ...

wat ook overigens mij vreemd is, is dat niet alle size waarden netjes op 0 staan geinitialiseerd, misschien een samenhangend iets?

Acties:
  • 0 Henk 'm!

Verwijderd

In PHP5 is de opzet van constructors verandert, ligt het daar misschien aan?

Edit: nee, PHP5 is in dit opzicht backwards-compatible. Toch lijkt je constructor het niet helemaal goed te doen.

[ Voor 44% gewijzigd door Verwijderd op 02-10-2004 22:11 ]


Acties:
  • 0 Henk 'm!

  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
ik werk nog met php 4. de aanroep is als volgt:

PHP:
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
/*
 *    Set level 0 (root)
 */
$node_0 = &new hierarchynode( );
$node_0->setid( 1 );
$node_0->setpid( 0 );
$node_0->setname( "1" );
$node_0->setlevel( 0 );

/*
 *    Set level 1
 */
$node_1 = &new hierarchynode( );
$node_1->setid( 2 );
$node_1->setpid( 1 );
$node_1->setname( "1.2" );
$node_1->setlevel( 1 );

....

/*
 *    Set children of node 0
 */
$node_0->push( &$node_1 );

.....


het valt dus wel op, dat size de enige property is die niet via een "setter" wordt gezet, maar intern wordt opgehoogd, maar dit zou niks uit mogen maken natuurlijk...

[ Voor 34% gewijzigd door Krooswijk.com op 02-10-2004 22:22 ]


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

De eerste keer is $this->size nog null ipv 0. Dat wordt dus de index van je eerste item.

Acties:
  • 0 Henk 'm!

  • tato
  • Registratie: Juni 2003
  • Laatst online: 15-09 18:26
Moeten die variabelen in uw class staan?

Je maakt eerst je variabelen aan, en dan pas ga je je class aanmaken. Hier zit toch een foutje denk ik.

Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

WormLord schreef op 03 oktober 2004 @ 08:39:
De eerste keer is $this->size nog null ipv 0. Dat wordt dus de index van je eerste item.
PHP:
1
        $this->size  = 0;

Dit staat toch anders vrij duidelijk in z'n constructor? Naar mijn weten heeft PHP toch wel een duidelijk verschil tussen NULL en 0?

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 19:57

Kees

Serveradmin / BOFH / DoC
Krooswijk.com schreef op 02 oktober 2004 @ 22:05:
echter in de print_r van het array zie je dat het eerste sub-node object geen index heeft, dus een index [] ipv [0]. hoe kan dit voorkomen. ik kan het echt nergens in plaatsen. het is dus nodig ivm het doorlopen van de subnodes in een for-lusje. nu krijg ik dus een: Fatal error: Call to a member function on a non-object in ...

wat ook overigens mij vreemd is, is dat niet alle size waarden netjes op 0 staan geinitialiseerd, misschien een samenhangend iets?
Is dit niet makkelijker? dan maakt php zelf de keys aan. Zo te zien is je size NULL, en dus nog niet goed geinitialiseerd.
PHP:
1
2
3
4
5
function push( &$node )
    {
        $this->nodes[] = &$node;
        $this->size++;
    }

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
even iets anders, je kunt je constructor ook variabelen meegeven hoor. Hoeft echt niet achteraf met 4 setters om je variabelen te setten.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Verwijderd

Ik begrijp niet helemaal waarom je niet sizeof of count gebruikt.

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Je kan ook waarden aan variabelen meegeven, dan kun je je constructor achterwege laten
PHP:
1
2
3
4
5
6
class myObj
{
  var $integer = 0;
  var $string = '';
  var $array = array();
}
Pagina: 1