Avatar billede brandy Nybegynder
07. oktober 2003 - 09:52 Der 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)
Avatar billede erikjacobsen Ekspert
07. oktober 2003 - 09:55 #1
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.

Interesseret?
Avatar billede brandy Nybegynder
07. oktober 2003 - 10:09 #2
Ja - meget :-) især i en Array-løsning
Avatar billede brandy Nybegynder
07. oktober 2003 - 10:11 #3
Er også lidt bange for at der er for meget der kan gå galt i en rekursiv-funktion.
Avatar billede erikjacobsen Ekspert
07. oktober 2003 - 10:27 #4
Men jeg skal lige have forklaret: du har to tabeller, indhold og galleri.
Hvod står der i dem, og hvad skal det bruges til?
Avatar billede brandy Nybegynder
07. oktober 2003 - 13:09 #5
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?
Avatar billede brandy Nybegynder
07. oktober 2003 - 13:10 #6
De skal naturligvis listes under den sektion de tilhører
Avatar billede erikjacobsen Ekspert
07. oktober 2003 - 13:21 #7
Eh, kan du ikke bare uddybe det eksempel du allerede har... ;)
Avatar billede brandy Nybegynder
07. oktober 2003 - 13:48 #8
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.
Avatar billede brandy Nybegynder
07. oktober 2003 - 13:49 #9
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?
Avatar billede erikjacobsen Ekspert
07. oktober 2003 - 14:15 #10
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*
Avatar billede brandy Nybegynder
07. oktober 2003 - 14:22 #11
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 ;)
Avatar billede brandy Nybegynder
07. oktober 2003 - 14:43 #12
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 .= "&nbsp;&nbsp;";
    }
    $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;
}
?>
Avatar billede erikjacobsen Ekspert
07. oktober 2003 - 14:49 #13
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.
Avatar billede brandy Nybegynder
07. oktober 2003 - 15:00 #14
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 .= "&nbsp;";
    }
    $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
Avatar billede erikjacobsen Ekspert
07. oktober 2003 - 15:04 #15
"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*"
Avatar billede brandy Nybegynder
07. oktober 2003 - 15:11 #16
Damn ;) troede ellers jeg lige havde dig der...

ØNSKET RESULTAT:
------------------
Om os
  TEst
  sssf
    Nyt
    Gru
      Php
      Test(side)
      HTML
  ssff
  Side(side)
Produkter
Side123(Side
Services
Kontakt

DATA:
indhold har sider som ... indhold
-navn
-sektion
-tekst

Er det ca. sådan du vil have det?
Avatar billede erikjacobsen Ekspert
07. oktober 2003 - 18:04 #17
Jeg kigger på det  ...  senere ;)
Avatar billede brandy Nybegynder
08. oktober 2003 - 11:33 #18
Har du kigget på det ? ;)
Avatar billede brandy Nybegynder
10. oktober 2003 - 15:24 #19
Har du grejet den? Jeg giver gerne flere points...
Avatar billede erikjacobsen Ekspert
10. oktober 2003 - 16:48 #20
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 ....
Avatar billede brandy Nybegynder
10. oktober 2003 - 17:07 #21
Selvfølgelig har jeg tid til at vente på hjælp :-)
Avatar billede brandy Nybegynder
17. november 2003 - 11:45 #22
Jeg lukker da jeg selv har fået det til at fungere perfekt med en rekursiv-funktion. Tak for hjælpen Erik!
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester