---
title: "recursiv funktion, oändliga nivåer"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/175373-recursiv-funktion-oändliga-nivåer"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "hybris"
published: "2008-11-17T17:40:10.000Z"
updated: "2008-11-18T21:38:53.000Z"
replies: 5
views: 553
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/175373-recursiv-funktion-oändliga-nivåer"
---

# recursiv funktion, oändliga nivåer

## #1 — hybris, 2008-11-17T17:40Z

kan någon förklara följande recursiva funktion för att hämta 
ett menyträd med oändliga nivåer

vad är till exempel syftet med variabeln $level  ?

jag får bara det hela att loopa i oändlighet

\<?php
// $parent is the parent of the children we want to see
// $level is increased when we go deeper into the tree,
//        used to display a nice indented tree
function display_children($parent, $level) {
   // retrieve all children of $parent
   $result = mysql_query('SELECT title FROM tree '.
                          'WHERE parent="'.$parent.'";');

   // display each child
   while ($row = mysql_fetch_array($result)) {
       // indent and display the title of this child
       echo str_repeat('  ',$level).$row\['title'\]."\\n";

       // call this function again to display this
       // child's children
       display_children($row\['title'\], $level+1);
   }
}
?\>

Permalänk: https://www.webforum.nu/p/175373

## #2 — Lasp, 2008-11-17T18:18Z

Är det ett kurssvar du försöker få tillrättalagt?

Permalänk: https://www.webforum.nu/p/2153560

## #3 — aasah, 2008-11-17T23:11Z

> **Lasp skrev:**
>
> Är det ett kurssvar du försöker få tillrättalagt?

Ja. Se [detta intressanta inlägg](http://www.webforum.nu/showthread.php?p=1445490#post1445490).

Permalänk: https://www.webforum.nu/p/2153589

## #4 — hybris, 2008-11-18T14:35Z

tack ändå, det var jag som skrev det inlägget, jag vet... 
frågan kvarstår ifall någon har lust att förklara, jag har 
mer eller mindre gett upp och gör en annan sak, vad jag 
lyckades göra med den functionen är en oändlig loop...

Permalänk: https://www.webforum.nu/p/2153649

## #5 — pulse, 2008-11-18T21:37Z

Ditt exempel är ju hämtat från den här sidan (som nån redan hänvisade till förut):
<http://www.sitepoint.com/article/hierarchical-data-database/>

Tycker den artikeln förklarar det hela väldigt bra. Jag föredrar bara att använd id-nummer istället för "title" som parent för att få allting unikt och undvika krockar. 

Det är en rekursiv funktion som kommer anropa sig själv tills den hämtat alla childs till den parent du skickar in.

```
item / level
food 0
	fruits 1
		apples 2
		bananas 2
	meat 1
		hamburgers 2
			Big Mac 3
```

Level håller reda på vilken nivå i trädet du befinner dig på. Nivån under "food" kommer ha level 1, leveln under dessa kommer ha 2osv. Säg att du skickar in:

```
echo "<pre>";
display_children("food" 0);
```

Först kommer den köra: select \* from items where parent = "food". Ditt resultset blir:
fruits, meat

Sen ska den loopa igenom resultsetet och för varje item i det kommer den upprepa frågan. Den kommer också öka $level med 1 varje gång den går djupare i trädet. Nästa fråga blir:
select \* from items where parent = "fruits"
apples, bananas

Sen kör den: select \* from items where parent = "apples"
Den frågan kommer ge ett tomt resultat alltså kommer den inte fortsätta längre ner där (den kör inte while satsen) utan då kommer den gå tillbaks till loopen från "fruits" (rekursion) och ta nästa vilket är "bananas". När den går från "apples" till fruits kommer $level sättas till 1 igen tack vare rekursionen. Vill du ha en bra förklaring vad som händer så kan du kolla in den här boken: <http://www.adlibris.com/se/product.aspx?isbn=1556220782>. Den har den bästa introduktion till rekursion, grafer mm som jag har sett.

Iaf "bananas" har inte heller några childs så då går den till meat och sen kör den ner i det trädet tills den tillslut hämtat alla childs till food.

Detta är inte speciellt effektiv eftersom det kommer bli många sql-frågor. Därför kan man hämta alla noder i hela trädet i en fråga (select \* from items) och sen bygga trädet i php det är mycket bättre. Du kan också läsa sida2 på sitepoint-tutorialen så ser du ett annat sätt att göra det på med bara en sql-fråga (modified preorder tree traversal).

Permalänk: https://www.webforum.nu/p/2153699

## #6 — pulse, 2008-11-18T21:38Z

Du måste ge oss exempeldatan du använder + din relevanta kod annars är det lite svårt att veta varför du får oändlig loop.

Permalänk: https://www.webforum.nu/p/2153701

---

Tråden på webben: https://www.webforum.nu/amne/php/175373-recursiv-funktion-oändliga-nivåer
