Avatar billede bamzen Nybegynder
26. januar 2005 - 11:53 Der er 2 kommentarer

En funktion der kalder sig selv - how to.

Hej, jeg vil skabe en menu med php. Problemet er at strukturen er dynamisk, altså ved jeg ikke hvor mange underpunkter der er til et givent hovedpunkt.

jeg har tre primære felter i min database
nøglefeltet id
parent (int) der peger på 0 eller en værdi fra en id
menusubject der indeholder en titel til menupunktet

jeg ville så lave en function ala

function buildMenu($level="0"){
$entries = mysql_query("SELECT * FROM menutable where parent='$what'");
while($entry = mysql_fetch_array($entries)){
echo $entry['id']." - ".$entry['menusubject'];
buildMenu($entry['id']);
}

}

men det kager den totalt over, men hvorfor... er der en der kan komme med en god beskrivelse af en sådan funktion der gentager sig selv i stil med ovenstående.

/BamZen
Avatar billede well_r Nybegynder
26. januar 2005 - 12:48 #1
to sek
jeg finder lige en jeg engang lavede :)
Avatar billede well_r Nybegynder
26. januar 2005 - 12:51 #2
// SQL fil
CREATE TABLE jamal (
  id int(9) unsigned NOT NULL auto_increment,
  parent_id int(9) NOT NULL default '0',
  navn varchar(20) NOT NULL default '',
  PRIMARY KEY  (id)
) TYPE=MyISAM;

#
# Data dump for tabellen `jamal`
#

INSERT INTO jamal VALUES (1, 0, 'hejsa');
INSERT INTO jamal VALUES (2, 0, 'hejsa2');
INSERT INTO jamal VALUES (3, 0, 'hejsa3');
INSERT INTO jamal VALUES (4, 1, 'hejsa4');
INSERT INTO jamal VALUES (5, 3, 'hejsa5');
INSERT INTO jamal VALUES (6, 7, 'hejsa6');
INSERT INTO jamal VALUES (7, 4, 'hejsaasd');
INSERT INTO jamal VALUES (8, 5, 'dasdfdsa');


//
samlet.php
<?
include("connect.php");
?>
Her ser du bare en liste over alle de rækker der er i tabellen. Skrevet op med deres ID først og dernæst deres navn.<br>
<select name="hej"><?
$res_alle_kat = mysql_query("SELECT * FROM jamal order by id ASC");
while ($row_alle_kat = mysql_fetch_array($res_alle_kat)){
    print "<option>".$row_alle_kat[navn]."</option>\n";
}
?></select>
<br><br><br><br>
Her ser du hvordan du meget let og ret forståeligt for selv en nybegynder, kan lave en kategori-menu med underkategorier. Disse kategorier er hver især udstyret med et id og et parent id, samt et navn.
Bemærk! --------- viser blot hvor den næste "hovedkategori" starter. Denne kan selvfølgelig fjernes ved at slette *1<br>
<?
function getchildmenu($id = 0,$space = ""){
    $res = mysql_query("SELECT * FROM jamal where parent_id='$id' order by id ASC") or die (mysql_error());
    while ($row = mysql_fetch_array($res)){
        print "<option>".$space." - ".$row[navn]."</option>\n";
        getchildmenu($row[id],$space."&nbsp;");
        print $id;                        //*1
        if (!$id){                        //*1
            print "<option>-------------</option>\n";    //*1
        }                            //*1
    }
}
?>

<select name="hej2">
<? getchildmenu(); ?>
</select>
<br><br><br><br>
Læg mærke til at jeg her har valgt ID 6 da denne har flest parents. Tjek evt. mysql!<br>
du kan selvfølgelig også bare give getparentmenu() en første parameter, som får den til at starte ved hvilkensomhelst række.<br>
Denne funktion er desuden lavet på fuldstændig samme måde som getchildmenu(), dog med et par finjusteringer.<br><?
function getparentmenu($id = 6,$space = ""){
    $res = mysql_query("SELECT * FROM jamal where id='$id'") or die (mysql_error());
    while ($row = mysql_fetch_array($res)){
        print "<option>".$space."- ".$row[navn]."</option>\n";
        getparentmenu($row[parent_id],$space."&nbsp;");
    }
}?>
<select name="hej3">
<? getparentmenu(); ?>
</select>
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

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