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