/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Problemer med rekursiv funktion
Fra : Jonas Delfs


Dato : 17-10-01 01:04

Hej -

Jeg har en tabel i min (mysql) database ved navn 'pages'.
Denne tabel består bl.a. af kolonnerne id og nav_parent. id indeholder et
unikt id for hver række, genereret vha. AUTO_INCREMENT.
Kolonnen nav_parent indeholder en reference til en anden række, dvs. id'et
på en anden række som den hører under. Hvis en række har nav_parent=0 er det
fordi den ikke hører under noget, altså en form for hovedpunkt.
Jeg skal nu har skrevet en (rekursiv) funktion der returnerer et
multidimensionalt array der viser denne struktur.
Hvis jeg fx. havde følgende i 'pages':

id | nav_parent
1 | 0
2 | 1
3 | 2
4 | 2

- skulle funktionen returnere et array med en struktur alá:

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

Det er klart at der skal skrives en rekursiv funktion til formålet, men
hvordan den skal kalde sig selv (vha. &-operatoren) for at returnere ét
array, kan jeg ikke lige regne ud.

Al (kompetent) hjælp modtages med kyshånd.
På forhånd tak.

--
Mvh./Best Regards
Jonas Delfs, http://delfs.dk
Søger freelance PHP-arbejde

 
 
Thomas Lindgaard (17-10-2001)
Kommentar
Fra : Thomas Lindgaard


Dato : 17-10-01 09:48

Davs

> Det er klart at der skal skrives en rekursiv funktion til formålet, men
> hvordan den skal kalde sig selv (vha. &-operatoren) for at returnere ét
> array, kan jeg ikke lige regne ud.

Et (forhåbentlig brugbart) gæt (som jeg fralægger mig ethvert ansvar for :)

function Rekursiv( $hovedpunkt )
{
$return_value = array()

select * from table where nav_parent = $hovedpunkt

foreach ( row in result )
{
$return_value = array_merge($return_value, Rekursiv( $underpunkt fra
result ))
}

return $return_value
}

Tanken er følgende:

Den rekursive funktion kalder sig selv, indtil den når "bunden", hvorefter
den returnerer arrays bestående af punkter og underpunkter. Et punkt kan
have flere underpunkter, så disse merges sammen til eet array og returneres
til kaldet ovenover. Når man når toppen igen, er det mit håb, at funktionen
har samlet den information sammen, som den skulle... (av av)

Håber du kan bruge det til noget...
/Thomas



Jonas Delfs (17-10-2001)
Kommentar
Fra : Jonas Delfs


Dato : 17-10-01 23:00

"Thomas Lindgaard" <thomas@dnspilot.com> wrote in message
news:9qjgg2$ujd$1@news.cybercity.dk...

> > Det er klart at der skal skrives en rekursiv funktion til formålet, men
> > hvordan den skal kalde sig selv (vha. &-operatoren) for at returnere ét
> > array, kan jeg ikke lige regne ud.
>
> Et (forhåbentlig brugbart) gæt (som jeg fralægger mig ethvert ansvar for
:)
[snip kode]
>
> Tanken er følgende:
[snip tanke]

Mange tak for inspiration. Jeg havde sat mine tanker fast i at det skulle
løses med &-operatoren og havde derfor ikke skænket array_merge() en tanke i
denne sammenhæng.
Det blev dog ikke helt løsningen, da hverken array_merge() eller
array_merge_recursive() var tilstrækkelige. Heldigvis havde en hvis hr.
kc@hireability.com på
http://www.php.net/manual/en/function.array-merge-recursive.php postet en
funktion der har den ønskede funktionalitet.
Alt i alt ser løsningen således ud:

function getArray($nav_parent=0)
{
global $db;

$sql = "SELECT id FROM pages WHERE nav_parent=".$nav_parent;
$result = $db->query($sql);
while($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
$arr = array($row['id'] => $this->getArray($row['id']));
$return_value = array_merge_clobber((array)$return_value, $arr);
}

return $return_value;
}

Takker.

--
Mvh./Best Regards
Jonas Delfs, http://delfs.dk
Søger freelance PHP-arbejde



Søg
Reklame
Statistik
Spørgsmål : 177522
Tips : 31968
Nyheder : 719565
Indlæg : 6408670
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste