07. oktober 2003 - 09:52Der er
21 kommentarer og 1 løsning
Rekursiv funktion
Hej! Troede jeg fandt løsningen på dette igår men nej! Denne funktion skal generere en dynamisk menu. Den er rekursiv da jeg ønsker muligheden for at lave mange undersektioner. -------------- <? include("includes/menu.js"); ?> <? function sektion ($sektion_id,$level){ $side_grafik = "<img src=\"grafik/side.gif\" align=\"absmiddle\" alt=\"Side\">"; $mappe_grafik = "<img src=\"grafik/mappe.gif\" align=\"absmiddle\" alt=\"Sektion\">"; $resultat = mysql_query("SELECT * FROM sektioner WHERE relation = '$sektion_id' AND aktiv = 'ja' ORDER BY prioritet ASC") or die (mysql_error()); while ($raekke = mysql_fetch_array($resultat)){ echo "$mappe_grafik $raekke[navn]$level<br>"; echo "<div style='display: block;' id='$raekke[navn]'>"; $resultat1 = mysql_query("SELECT * FROM sektioner WHERE relation = '$raekke[id]' AND aktiv = 'ja' ORDER BY prioritet ASC") or die (mysql_error()); if (mysql_num_rows($resultat1)>= 1){ while ($raekke1 = mysql_fetch_array($resultat1)){ echo "--<br>"; $level++; sektion ($raekke[id],$level); } } $level = 0; $resultat2 = mysql_query("SELECT * FROM indhold WHERE sektion = '$raekke[id]' AND aktiv = 'ja' ORDER BY prioritet ASC") or die (mysql_error()); while ($raekke2 = mysql_fetch_array($resultat2)){ echo "$side_grafik <a href='indhold.php?vis=$raekke2[id]'>$raekke2[navn]</a><br>"; } $resultat5 = mysql_query("SELECT * FROM galleri WHERE sektion = '$raekke[id]' AND aktiv = 'ja' ORDER BY prioritet ASC") or die (mysql_error()); while ($raekke5 = mysql_fetch_array($resultat5)){ echo "$side_grafik <a href='liste.php?vis=$raekke5[id]'>$raekke5[navn]</a><br>"; } echo "</div>"; } $resultat2 = mysql_query("SELECT * FROM indhold WHERE sektion = '$sektion_id' AND aktiv = 'ja' ORDER BY prioritet ASC") or die (mysql_error()); while ($raekke2 = mysql_fetch_array($resultat2)){ echo "$side_grafik <a href='indhold.php?vis=$raekke2[id]'>$raekke2[navn]</a><br>"; } $resultat5 = mysql_query("SELECT * FROM galleri WHERE sektion = '$sektion_id' AND aktiv = 'ja' ORDER BY prioritet ASC") or die (mysql_error()); while ($raekke5 = mysql_fetch_array($resultat5)){ echo "$side_grafik <a href='liste.php?vis=$raekke5[id]'>$raekke5[navn]</a><br>"; } } ?> <? sektion (0,0); ?> ------------------ Tihørende data: ------------------- id dato aktiv navn relation prioritet 1 0 ja Om os 0 1 3 0 ja Produkter 0 2 4 0 ja Services 0 3 5 0 ja Kontakt 0 4 6 0 ja Asd 5 5 7 0 ja fgh 6 6 8 0 ja Holk 7 7 9 0 ja TEst 1 8 10 0 ja sssf 9 9 11 0 ja ssff 1 10 ------------------ Fejlen opstår ved undermenuerne. Den laver dobbelt af det hele. Nogen der kan hjælpe? (aktiv = ja ---- ved godt det skal være aktiv = 1 - bliver ændret)
Hvis det kun er menuer, og dermed ganske få data, ville jeg ikke bøvle med en rekursiv funktion, men blot læse det hele ind i et par arrays, og så lave menuen derfra.
Så er jeg tilbage fra et møde.... indhold og galleri indeholder sidenavne, sektion-id og indhold til siderne. Så det de bruges til er links i menuen. De skal naturligvis listes under hver sektion. Kan du hjælpe mig lidt på vej?
Erik--> Kan du hjælpe mig til at smide sektionerne i et array, på en sådan måde, at der opstår en træ-struktur? Det jeg vil undgå er, at fastlåse menuen til kun at have x antal undermenuer. Derfor den rekursive funktion.
Jeg forestiller mig, at et sådant array kan bruges til at hente de sider som skal være under hver enkelt sektion frem, bare ved et sql kald i en while-løkke...er jeg helt galt på den?
Det kan man sagtens, og det skal du få ;) Jeg skal bare have et eksempel at gå ud fra: typiske data i tabellerne, og (så nogenlunde) det ønskede resultat. Og nej, jeg gider ikke sætte mig ind i din kode *g*
Hehe...jeg er nået frem til dette ved at søge MEGET på php.net og her på E: <? function get_children($id,$level) { $level++; $result = mysql_query("SELECT * FROM sektioner WHERE relation = '$id'"); $count = 0; while ($row = mysql_fetch_array($result)) { $children[$count]["id"] = $row["id"]; $children[$count]["navn"] = $row["navn"]; $children[$count]["relation"] = $row["relation"]; echo $level . $children[$count]["navn"] . "<br>"; get_children($children[$count]["id"],$level); $count++; } return $children; } ?> <? get_children (0,0); ?>
Minder en del om mit første eksempel - udskriver dette: 1Om os 2TEst 3sssf 2ssff 1Produkter 1Services 1Kontakt 2Asd 3fgh 4Holk
Tallene illustrerer hvor langt inde i menuen sektionen "findes" - Kan du med din ekspertise, som jeg ved du har ;), fortælle mig om det virker programmeringsmæssigt altså? de forskellige links fra indhold og galleri skal jeg nok få sat ind ... håber jeg ;)
Erik! Jeg tror sq jeg har løst det! :) og det funker :D smider lige koden her - jeg vil blive glad hvis du kunne sige enten " Det ser godt ud" eller " Det er fanme noget hø" - så vidt jeg kan se skulle det være perfekt nu ;) takker for hjælpen anyway - du plejer ikke at ville have point?! Men læg et svar, nogen gange er det bare inspiration der skal til, men det kan være mere værd end en færdig løsning! .-----------. <? function get_children($id,$level){ if ($id == 0){ $level = ""; } else { $level .= " "; } $result = mysql_query("SELECT * FROM sektioner WHERE relation = '$id'"); $count = 0; while ($row = mysql_fetch_array($result)){ $children[$count]["id"] = $row["id"]; $children[$count]["navn"] = $row["navn"]; $children[$count]["relation"] = $row["relation"]; $temp_navn = $children[$count]["navn"]; echo "$level$mappe_grafik <a onClick=\"DocClickHandler('$temp_navn');\" style='cursor: hand' class='sektion'>$temp_navn</a><br>"; echo "<div style='display: none;' id='$temp_navn'>"; // echo $level . $children[$count]["navn"] . "<br>"; $temp_id = $children[$count]["id"]; $resultat2 = mysql_query("SELECT * FROM indhold WHERE sektion = '$temp_id' AND aktiv = 'ja' ORDER BY prioritet ASC") or die (mysql_error()); while ($raekke2 = mysql_fetch_array($resultat2)){ echo "$level<a href='indhold.php?vis=$raekke2[id]'>$raekke2[navn]</a><br>"; } $resultat5 = mysql_query("SELECT * FROM galleri WHERE sektion = '$temp_id' AND aktiv = 'ja' ORDER BY prioritet ASC") or die (mysql_error()); while ($raekke5 = mysql_fetch_array($resultat5)){ echo "$level<a href='liste.php?vis=$raekke5[id]'>$raekke5[navn]</a><br>"; } get_children($children[$count]["id"],$level); $count++; echo "</div>"; } // return $children; } ?>
Ok. Jeg tror du får langt bedre overblik ved at adskille dine udtræk fra din præsentation i HTML. Det er imidlertid ikke nødvendigt med så mange SQL-kald, og for den sags skyld rekursion: du kan opnå de samme arrays med en enkelt SELECT pr tabel, hvor du selvfølgelig kigger på felterne for at putte værdierne det rigtige sted hen i dine arrays.
Man du kan sikkert leve med det ;)
Da du ikke har givet mig de eksempler, som jeg skal have for at kunne finde ud af det, så kan jeg ikke lave det for dig.
Men overvej derudover om dette er en beregning der skal laves hver gang din side skal vises! Hvis dine menuer er nogenlunde statiske kunne du med fordel generere en simpel inklude fil fra dit PHP script, med resultatet, og så bare kalde denne PHP fil hver gang du ændrer i menuerne.
Og, nej tak, jeg løste ikke dit problem, så ingen point til mig.
Arrays er desværre langt fra min bedste egenskab indenfor PHP... Men hvis jeg lige renser funktionen og giver dig de info du skal bruge kan du så hjælpe med at lave de kald og arrays rigtigt? --------------------- <? function get_children($id,$level){ $side_grafik = "<img src=\"grafik/side.gif\" align=\"absmiddle\" alt=\"Side\">"; $mappe_grafik = "<img src=\"grafik/mappe.gif\" align=\"absmiddle\" alt=\"Sektion\">"; if ($id == 0){ $level = ""; } else { $level .= " "; } $result = mysql_query("SELECT * FROM sektioner WHERE relation = '$id'"); $count = 0; while ($row = mysql_fetch_array($result)){ $children[$count]["id"] = $row["id"]; $children[$count]["navn"] = $row["navn"]; $children[$count]["relation"] = $row["relation"]; $temp_navn = $children[$count]["navn"]; echo "$level$mappe_grafik <a onClick=\"DocClickHandler('$temp_navn');\" style='cursor: hand' class='sektion'>$temp_navn</a><br>"; echo "<div style='display: none;' id='$temp_navn'>"; $temp_id = $children[$count]["id"]; $resultat2 = mysql_query("SELECT * FROM indhold WHERE sektion = '$temp_id' AND aktiv = 'ja' ORDER BY prioritet ASC") or die (mysql_error()); while ($raekke2 = mysql_fetch_array($resultat2)){ echo "$level$side_grafik <a href='indhold.php?vis=$raekke2[id]'>$raekke2[navn]</a><br>"; } $resultat5 = mysql_query("SELECT * FROM galleri WHERE sektion = '$temp_id' AND aktiv = 'ja' ORDER BY prioritet ASC") or die (mysql_error()); while ($raekke5 = mysql_fetch_array($resultat5)){ echo "$level$side_grafik <a href='liste.php?vis=$raekke5[id]'>$raekke5[navn]</a><br>"; } get_children($children[$count]["id"],$level); $count++; echo "</div>"; } if ($id == 0){ $resultat2 = mysql_query("SELECT * FROM indhold WHERE sektion = '$id' AND aktiv = 'ja' ORDER BY prioritet ASC") or die (mysql_error()); while ($raekke2 = mysql_fetch_array($resultat2)){ echo "$level$side_grafik <a href='indhold.php?vis=$raekke2[id]'>$raekke2[navn]</a><br>"; } $resultat5 = mysql_query("SELECT * FROM galleri WHERE sektion = '$id' AND aktiv = 'ja' ORDER BY prioritet ASC") or die (mysql_error()); while ($raekke5 = mysql_fetch_array($resultat5)){ echo "$level$side_grafik <a href='liste.php?vis=$raekke5[id]'>$raekke5[navn]</a><br>"; } } } ?> -------------------------------------- indhold: CREATE TABLE indhold ( id int(10) NOT NULL auto_increment, dato int(15) NOT NULL default '0', pubdato int(15) NOT NULL default '0', aktiv varchar(5) NOT NULL default '', navn varchar(100) NOT NULL default '', overskrift varchar(250) NOT NULL default '', tekst text NOT NULL, type varchar(100) NOT NULL default '0', sektion int(10) NOT NULL default '0', hits int(8) NOT NULL default '0', prioritet int(3) NOT NULL default '0', KEY id (id) ) TYPE=MyISAM; ----------------------------------- Galleri er magen til indhold
"Jeg skal bare have et eksempel at gå ud fra: typiske data i tabellerne, og (så nogenlunde) det ønskede resultat. Og nej, jeg gider ikke sætte mig ind i din kode *g*"
Nej, jeg har bare glemt dig i kampens hede.... Du skal endelig ikke ændre på point, så er jeg nemlig smuttet - point er ligegyldige ... der går nok ½-1½ dag - så hvis du har tid til at vente ....
Jeg lukker da jeg selv har fået det til at fungere perfekt med en rekursiv-funktion. Tak for hjælpen Erik!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.