Avatar billede fcknet Nybegynder
29. november 2003 - 21:57 Der er 6 kommentarer og
1 løsning

Kategorier i flere niveauer

Jeg har en tabel i min database som indeholder felterne ID (primær, autonummerering), parent (smallint, unsigned) og navn (text).

Jeg har fx. følgende poster:
id  parent  navn 
1 0 Programmering
2 1 Script
3 2 PHP
4 2 ASP
5 1 Andet
6 0 Feriesteder
7 6 Spanien
8 7 Mallorca
9 7 Ibiza
10 6 Italien
11 10 Toscana
12 10 Sicilien

Hvordan får jeg skrevet dem ud i flere niveauer:

Programmering
---Script
------PHP
------ASP
---Andet
Feriesteder
---Spanien
------Mallorca
------Ibiza
---Italien
------Toscana
------Sicilien

Jeg ved ikke rigtigt hvordan jeg skal gøre det når jeg vil kunne bruge uendeligt mange underkategorier!
Avatar billede cautoo Nybegynder
29. november 2003 - 22:14 #1
jeg skriver nogle koder som fif, de skal ændres lidt, så de passer til PHP.. kan ikk lige huske navnene på nogle af mysql kaldene og sådan...


function loadlinier(id, tekst) {
select * from tabel
where parent=$id

while LØKKE MED DE ENKELTE LINIER {
$mintekst := "$mintekst$MYSQL-RÆKKE['NAVN']<BR>";
$mintekst := $mintekst + loadlinier($MYSQL-RÆKKE['ID'], $tekst+'---');
}
result = $mintekst;

}
Avatar billede cautoo Nybegynder
29. november 2003 - 22:15 #2
den skal selvfølgelig startet med:
loadlinier(0, '')
Avatar billede cautoo Nybegynder
29. november 2003 - 22:16 #3
hovsa glemte "tekst" varieblen... egentlig bare ment til at sætte --- foran undermenuerne:

function loadlinier(id, tekst) {
  select * from tabel
  where parent=$id

  while LØKKE MED DE ENKELTE LINIER {
    $mintekst := "$mintekst$tekst$MYSQL-RÆKKE['NAVN']<BR>";
    $mintekst := $mintekst + loadlinier($MYSQL-RÆKKE['ID'], $tekst+'---');
  }
  result = $mintekst;

}
Avatar billede rackbox Nybegynder
29. november 2003 - 22:17 #4
function category_tree_iterate($branches, $top_id = 0, $level = 0) {
// $branches is an array containing branches that should not be visible (nor children)
        $arr = array();
        $level++;
        $query = "select * from category_tree where parent=".$top_id." order by priority";
        $result = mysql_query($query);
        while ($row=mysql_fetch_array($result)){
                if (!in_array($row['id'],$branches)){
                        $arr[$row['id']] = $level-1;
                        $arr2 = category_tree_iterate($branches,$row['id'],$level);
                        if (is_array($arr2)){
                                foreach ($arr2 as $key => $value)
                                $arr[$key] = $value;
                        }
                }

        }
        return $arr;

}

returnerer et array i formen
[id], [level]

Så er det bare at køre gennem arrayet med en foreach og lave [level] antal blanke/stjerner/dashes før navnet på din kategori, som du finder ved hjælp af din id.
Avatar billede fcknet Nybegynder
29. november 2003 - 23:10 #5
rackbox > Kan du ikke lige lave den foreach for mig?
Avatar billede rackbox Nybegynder
29. november 2003 - 23:19 #6
$branches[] = "";

$myArray = category_tree_iterate()
foreach ($myArray as $key => $value){
  echo str_repeat("-",$value);
  echo get_headline($key);
  echo "<br>\n";
}

Den funktion, der hedder get_headline skal være nogenlunde som følger:

function get_headline($id){
  $query = "select * from mintabel where id = ".$id;
  $result = mysql_query($query);
  $row = mysql_fetch_array($result);
  return $row['navn'];
}
Avatar billede rackbox Nybegynder
29. november 2003 - 23:20 #7
Bemærk: alt dette er vejledende... Du får ingen færdige kodestumper, du må osse selv arbejde lidt ;-) Iøvrigt ved jeg ikke hvad din tabel hedder..
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