webForumDet fria alternativet

recursiv funktion, oändliga nivåer

PHP

5 svar · 549 visningar · startad av hybris

Medlem sedan nov. 200862 inlägg
Frågan#1

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);

}
}
?>

Medlem sedan juli 200012 978 inlägg
#2

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

Medlem sedan mars 20034 471 inlägg
#3

Lasp skrev:

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

Ja. Se detta intressanta inlägg.

Medlem sedan nov. 200862 inlägg
#4

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...

Medlem sedan nov. 200373 inlägg
#5

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).

Medlem sedan nov. 200373 inlägg
#6

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.

259 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)