[php] level aangeven in een tree

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een stukje code geschreven (hieronder een zeer gestripte versie) om eenvoudig van mijn database records een tree te sorteren. (waar bijvoorbeeld 1 node onder de andere valt).

waarbij ik bijvoorbeeld een array in gooi waarbij ik in elke node, ID (nodename) en mainID (parentname) meegeef.

Het werkt prima, ik krijg mooi een lijst terug waarbij de volgorde klopt. Maar ik zou graag een level indicatie erbij willen hebben bijvoorbeel 1.2.1. Maar hoe en wat ik ook probeer, het lukt mij niet. En op google/tweakers vind ik ook niet veel nuttig :(.
Dit probleem ben ik geloof ik niet voor geboren lol : ) heb veel kunnen oplossen en dit lijkt zo simpel, maar toch lukt het niet...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    function getTree($parent)
    {       
        foreach( $this->node as $node )
        {           
            if( $node[ $this->parentname ] == $parent )
            {
                $this->addTree( $node[ $this->nodename ], $node );
                
                $this->getTree( $node[ $this->nodename ] );

            }
        }

    }
    
    function addTree($nodeid, $nodeinfo)
    {
        $this->flattree[ $nodeid ] = $nodeinfo;
    }

[ Voor 14% gewijzigd door Verwijderd op 02-11-2004 23:04 . Reden: ff wat onnodige code verwijdert ]


Acties:
  • 0 Henk 'm!

  • klinz
  • Registratie: Maart 2002
  • Laatst online: 17-09 15:24

klinz

weet van NIETS

Je kunt het level meegeven als parameter aan de functie getTree(). Bij de recursieve aanroep doe je dan zoiets.
code:
1
getTree(..., $level + 1)

Hierdoor weet je in elke iteratie op welk niveau je zit en kun je met wat extra code een string samenstellen als '1.2.1'.

Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Geef bij iedere aanroep van de code die een subtree maakt een string mee met het huidige niveau.

- Initieel geef je '' oftewel een lege string mee.
- Die subtree functie begint te tellen, en voegt aan de string 1 mee voor de eerste
volgende node in de subtree krijgt dan '2'
- Subnodes van '2' krijgen in de subtree functi nu niet '' mee maar '2' . '.' (oftewel '2.')
- Al die subnodes voegen nu weer hun nummer toe: '2.1', '2.2' enz...
- Subnodes hiervan doen weer '2.3.1' enz...


Ik weet niet precies wat klinz zegt, dus misschien deed ik dubbel O-)

edit:
uitgewerkt ziet het er ongeveer zo uit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?
    function getTree($parent, $level = '') 
    {        
        $i = 1; 
        foreach( $this->node as $node ) 
        {             
            if( $node[ $this->parentname ] == $parent ) 
            { 
                $this->addTree( $node[ $this->nodename ], $node, $level . $i++); 
                 
                $this->getTree( $node[ $this->nodename ], $level . '.'); 

            } 
        } 

    } 
     
    function addTree($nodeid, $nodeinfo, $level) 
    { 
        $this->flattree[ $nodeid ] = $level . ' ' . $nodeinfo; 
    }
?>


edit
Ow, ik zie dat dit wel niet precies zal werken :P
Maar kleine wijzigingen vallen wel zelf te doen ;)

[ Voor 75% gewijzigd door RwD op 03-11-2004 11:59 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thnx hartelijk bedankt, het is gelukt : )

hele classe is hier als iemand het ooit nodig heeft :P

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
<?

// EXAMPLE

/**

$tree   =   new tree();

$count = 100;

for( $i=1; $i<$count; $i++)
{
    $node[$i] = Array(  "nodeid"        => $i,
                "parentid"      => rand(0, $i - 1),
                "info"          => "hoi"
            );
}

$tree->setArray($node);

$tree->setNodeName("nodeid");

$tree->setParentName("parentid");

$treenode['0'] = $tree->getTree(0);

$prevnode   =   $tree->getPreviousNode(15);

echo $prevnode['nodeid'] . "<br>";

$nextnode   =   $tree->getNextNode(15);

echo $nextnode['nodeid'];

$tree->parse();

**/

class treeTool extends ToolClass
{

    var $nodename;
    var $parentname;
    var $node;
    var $flattree;
    var $childtree;
    var $processed = 1;

    function tree()
    {
        //
    }

    function setDatabaseResult($result)
    {
        $i = 1;

        while( $row = mysql_fetch_assoc( $result ) )
        {
            $this->node[$i] =   $row;

            $i++;
        }

    }

    function setArray($node)
    {
        $this->node = $node;
    }

    function getTree($parent, $level = '')
    {   
        $i = 1;
        foreach( $this->node as $node )
        {           
            if( $node[ $this->parentname ] == $parent )
            {               
                $node['processed'] = $this->processed++;
                if( $level == '' ) $node['level'] = $i;
                else $node['level'] = $level . '.' . $i;
                
                $this->setChild( $node[ $this->parentname ], $node[ $this->nodename ], $node );

                $this->addTree( $node[ $this->nodename ], $node );
                
                if( $level == '' ) $return[ $node[ $this->nodename ] ] = $this->getTree( $node[ $this->nodename ], $i);
                else $return[ $node[ $this->nodename ] ] = $this->getTree( $node[ $this->nodename ], $level . '.' . $i);
                
                $i++;
            }
            
        }

        return $return;

    }
    
    function getFlatTree()
    {
        return $this->flattree;
    }

    function setChild($parent, $child, $nodeinfo)
    {
        $this->childtree[ $parent ][ $child ] = $nodeinfo;
    }

    function setNodeName($nodename)
    {
        $this->nodename     = $nodename;
    }

    function setParentName($parentname)
    {
        $this->parentname   = $parentname;
    }

    function addTree($nodeid, $nodeinfo)
    {
        $this->flattree[ $nodeid ] = $nodeinfo;
    }

    function getChilds($parent)
    {
        return $this->childtree[ $parent ];
    }

    function getNode($node)
    {
        return $this->flattree[ $node ];
    }

    function getNextNode($nodeid)
    {
       reset( $this->flattree );
       
       while(current( $this->flattree )){  
        
            if( key( $this->flattree ) == $nodeid ){
                
                return next($this->flattree);

            }
            
            next( $this->flattree );

        }

        return false;
    }

    function getPreviousNode($nodeid)
    {
       reset( $this->flattree );
       
       while(current( $this->flattree )){  
        
            if( key( $this->flattree ) == $nodeid ){
                
                return prev($this->flattree);

            }
            
            next( $this->flattree );

        }

        return false;
    }

}

?>

[ Voor 53% gewijzigd door Verwijderd op 03-11-2004 15:48 ]