Hjælp til et rekursions problem.

Tags:    php

Er igang med at opbygge et menu system mest for at udfordre mig selv lidt med relationer. har lige nu opbygget et system hvor jeg gemmer menu punkter i en database med følgene information

id, parent_id, name, content

Meget simpelt har alle menu punkter et id selv. og et parent_id der henviser til det menupunkt der ligger over dem i hierakiet. og mine øverste punkter henviser til 0 som parent_id

dvs
1, 0, "Home", "noget content"
2, 0, "Artikler", "noget content"
3, 2, "Artikel 1", "noget content"
4, 2, "Artikel 2", "noget content"
5, 1, "Underpunkt", "noget content"

Ville se ca. sådan her ud i en menu:

Home
- Underpunkt
Artikler
- Artikel 1
- Artikel 2

Nu da i muligvis har set hvordan jeg har bygget dette op kommer jeg til php-delen som volder mig en smule besvær.

Har et simpelt array der bare beskriver de enkelte forhold mellem child og dens parent, hvor $array[id] == parent_id

array (
1 => 0
2 => 0
3 => 2
4 => 2
5 => 1
)

Hvad jeg så ønsker og prøver at udvikle er en metode/funktion der laver det ovenstående array om til noget der minder mere om nedenstående

array (
1 => array(5)
2 => array(3,4)
}

havde jeg haft flere underpunkter fx et underpunkt til id 3 der havde id'et 6 havde det fx. set sådan her ud:

array (
1 => array(5)
2 => array(3 => array(6),4)
}

Home
- Underpunkt
Artikler
- Artikel 1
-- Underpunkt til id 3
- Artikel 2

Håber i forstår hvad jeg prøver at opnå her, en funktion hvor jeg kan spytte det 1-dimelsionalle array ind

array (
1 => 0
2 => 0
3 => 2
4 => 2
5 => 1
)

og få et flere dimensionelt array ud.

array (
1 => array(5)
2 => array(3,4)
}

mit eksempel er lidt crude. men det skal virke om så man har et meget stort array ind med mange childnodes og mange underpunkter underhinanden.

Hvis i har en stump kode der kan gøre dette så ville jeg blive ovenud henrykt. har udlovet 200 point til den der kan klare det for mig. gav gerne 500 for det :( men der er restriktioner.




3 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
det er jo egentlig også det han gør:
Fold kodeboks ind/udKode 

han viser bare kun den info som han bruger. :)

Dog behøver man ikke at bruge en rekursiv funktion til at opbygge en træstruktur og tror også at den vil tage for lang tid at gennemføre.
Det jeg har gjort i sin tid, er først samle alle primære id'er. Disse gemmes til at checke for om child-id'er også kan få en "forældre". :) Hvis de ikke kan få en forældre sætter jeg child-id'et til 0(root).

Og så kommer guldkornet:
Fold kodeboks ind/udKode 


dog skal det lige siges, at hvis man krydser id'er på en måde der ikke vil være naturlig logisk, vil løkken lægge sitet ned.




Indlæg senest redigeret d. 23.05.2007 19:06 af Bruger #10216
Det skal siges at jeg også gerne modtager eksempel i C-Pseudo kode hvis folk ikke kender til php. bare det ikke er lisp kode eller lign. uforståeligt snask så kan jeg selv konvertere det til php :)



Virker ikke som et særlig smart system, bare at bruge de der numre til at styre det. Personligt ville jeg anbefale, at du istedet trak dataen ud, og lavede et array som:
Fold kodeboks ind/udKode 


Så smider du dette array ind i en funktion, og for et træ tilbage som:
Fold kodeboks ind/udKode 


Lige umiddelbart virker dette som en løsning som er nemmere at bruge, end at bare arbejde med ID'er



Indlæg senest redigeret d. 23.05.2007 18:45 af Bruger #2330
t