---
title: "Meny med oändligt undermenyer"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/169288-meny-med-oändligt-undermenyer"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "Asa"
published: "2008-02-23T08:37:24.000Z"
updated: "2008-02-25T18:07:41.000Z"
replies: 14
views: 1177
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/169288-meny-med-oändligt-undermenyer"
---

# Meny med oändligt undermenyer

## #1 — Asa, 2008-02-23T08:37Z

Jag skulle behöva en funktion som gör att jag kan ha en meny som man kan via en adminsida lägga till kategorier med underkategorier. Det ska kunna gå att ha oöndligt många understeg.

Någon som har en sådan färdig funktion eller har lust att hjälpa mig med detta? 

kategorier:
kategoriID - int
kategori - varchar
tkategoriID - int

Permalänk: https://www.webforum.nu/p/169288

## #2 — Asa, 2008-02-23T18:54Z

Det ska även se ut så här:

```
1 - Huvudmeny 1 - 0
    2 - Undermeny under 1.1 - 1
    3 - Undermeny under 1.2 - 1
    4 - Undermeny under 1.3 - 1
        5 - Undermeny under 3.1 - 3
        6 - Undermeny under 3.2 - 3
            7 - Undermeny under 6 - 6
        8 - Undermeny under 3.3 - 3
        9 - Undermeny under 3.4 - 3
10 - Huvudmeny 2 - 0
    11 - Undermeny - 10
```

Permalänk: https://www.webforum.nu/p/2084597

## #3 — aasah, 2008-02-24T09:57Z

> **Asa skrev:**
>
> Det ska även se ut så här:
>
>
> ```
> 1 - Huvudmeny 1 - 0
>     2 - Undermeny under 1.1 - 1
>     3 - Undermeny under 1.2 - 1
>     4 - Undermeny under 1.3 - 1
>         5 - Undermeny under 3.1 - 3
>         6 - Undermeny under 3.2 - 3
>             7 - Undermeny under 6 - 6
>         8 - Undermeny under 3.3 - 3
>         9 - Undermeny under 3.4 - 3
> 10 - Huvudmeny 2 - 0
>     11 - Undermeny - 10
> ```

Hur det ser ut styr du lämpligen via CSS, genom att sätta olika CSS-klasser beroende på djup. Jag skulle nog byggt upp den där menyn via arv, men eftersom du säkert har en modernare PHP än jag kan jag inte visa kod för det.

Permalänk: https://www.webforum.nu/p/2084663

## #4 — K@llen, 2008-02-24T10:52Z

En rekursiv funktion är vad du är ute efter, dvs en funktion som anropar sig själv. Vet att det finns bra exempel här på wF.

Permalänk: https://www.webforum.nu/p/2084668

## #5 — Asa, 2008-02-24T11:01Z

Hittade några men de skriver unte ut med mellanslag så det ser bra ut.

```
function menu($child_of){        
        if (!isset($child_of)){
            $child_of = 0;
        }
        
        $SQL = "SELECT kategoriID, kategori, tkategoriID FROM kategorier WHERE tkategoriID = " . $child_of . "";        
        $result = mysql_query($SQL) or die(mysql_error());
        while ($data = mysql_fetch_array($result)){
            echo $data[1]."<br>";
            menu($data[0]);
        }
 } 
    
echo menu(0);
```

Skrivs ut så här nu:

```
1 - Huvudmeny 1 - 0
2 - Undermeny under 1.1 - 1
3 - Undermeny under 1.2 - 1
4 - Undermeny under 1.3 - 1
5 - Undermeny under 3.1 - 3
6 - Undermeny under 3.2 - 3
7 - Undermeny under 6 - 6
8 - Undermeny under 3.3 - 3
9 - Undermeny under 3.4 - 3
10 - Huvudmeny 2 - 0
11 - Undermeny - 10
```

Permalänk: https://www.webforum.nu/p/2084671

## #6 — aasah, 2008-02-24T16:03Z

> **Asa skrev:**
>
> Hittade några men de skriver unte ut med mellanslag så det ser bra ut.

Du kan inte använda mellanslag för att få bra resultat i HTML - HTML struntar nämligen blankt i hur många mellanslag du stoppar in. Det blir bara ett mellanslag i alla fall.

```php
//I CSS - tex
.menu0{
padding:0px;
margin:0px;}

.menu1{
padding:2px;
margin:2px;}

.menu2{
padding:4px;
margin:4px;}

//.............

//I PHP
function menu($child_of){        
        if (!isset($child_of)){
            $child_of = 0;
        }
        
        $SQL = "SELECT kategoriID, kategori, tkategoriID FROM kategorier WHERE tkategoriID = " . $child_of . "";        
        $result = mysql_query($SQL) or die(mysql_error());
        while ($data = mysql_fetch_array($result)){
            echo '<div class="menu'.$level.'">'.$data[1];
            echo $level."</div><br>";
            menu($data[0]);
        }
 }
```

Permalänk: https://www.webforum.nu/p/2084724

## #7 — Asa, 2008-02-24T16:48Z

Men alltså. Visst idén är bra men då måste man ju loopa i stilmallen oxå för att få alla menu utskrivna. Fler tips?

level ska inte vara med i min kod...

Permalänk: https://www.webforum.nu/p/2084737

## #8 — aasah, 2008-02-24T16:57Z

> **Asa skrev:**
>
> Men alltså. Visst idén är bra men då måste man ju loopa i stilmallen oxå för att få alla menu utskrivna. ...

Va?   :q Nej, det sätts ju direkt i foreach-slingan som du redan gör. Här väljs vilken class som används: (första raden i while)

```php
echo '<div class="menu'.$level.'">'.$data[1];
```

Permalänk: https://www.webforum.nu/p/2084740

## #9 — Asa, 2008-02-24T17:25Z

Nu förstår vi nog varandra fel..

Man måste ju lägga in stilmallen oxå i en forloop på nå vis för att slippa skriva det manuellt. Sen **level** är inget som skall finnas i den koden jag har elelr som du ändrat i.

Permalänk: https://www.webforum.nu/p/2084750

## #10 — Travoni, 2008-02-24T18:03Z

Hur många "hundra" underkategorier skall du ha då? Enligt min erfarenhet så behövs sällan fler än 5 stycken men det är såklart beroende på vad man skall göra.
I annat fall kan du ju istället för att använda class skriva ut värdet direkt:
Pseudosyntax:

```php
echo '<div style="padding:'.($level*2).'px;margin:'.($level*2).'px">'.$data[1];
```

Permalänk: https://www.webforum.nu/p/2084757

## #11 — Asa, 2008-02-24T18:48Z

Jag vet inte hur många som behövs. SKa testa det du skrev nu..  Finns ju de som vill ha många underkategorier.. vem vet.. Jag hjälper ju andra med detta då och då men denna gången visste jag ej hur jag skulle göra.

Permalänk: https://www.webforum.nu/p/2084775

## #12 — Asa, 2008-02-24T18:53Z

Detta:

```
function menu($child_of){        
        if (!isset($child_of)){
            $child_of = 0;
        }
        $SQL = "SELECT kategoriID, kategori, tkategoriID FROM kategorier WHERE tkategoriID = " . $child_of . "";        
        $result = mysql_query($SQL) or die(mysql_error());
        while ($data = mysql_fetch_array($result)){
            echo '<div style="padding-left:'.($data[0]*2).'px;margin-left:'.($data[0]*2).'px">'.$data[2].'-'.$data[1].' - ID - '.$data[0].'</div>';
            menu($data[0]);
        }
 }
    
echo menu(0);
```

skrev ut det så här.. helt fel..

```
0-Datorer - ID - 1
  1-Stationära - ID - 2
      2-HP - ID - 5
    0-Skrivare - ID - 3
      3-Laser - ID - 4
        4-Canon - ID - 6
```

ska bli:

```
0-Datorer - ID - 1
  1-Stationära - ID - 2
    2-HP - ID - 5
0-Skrivare - ID - 3
  3-Laser - ID - 4
    4-Canon - ID - 6
```

Permalänk: https://www.webforum.nu/p/2084776

## #13 — jawbreaker, 2008-02-25T07:05Z

Jag tycker mer att menyn ser ut som nästlade listor istället för en massa div-taggar, men du kanske har dina anledningar till att inte använda listor? :)

Annars, som listor (med reservation för att hjärnan går på halvfart tidiga måndagmorgnar och att jag inte kan testa PHP-funktionen):

```
function menu($child_of) {
	if (!isset($child_of)) {
		$child_of = 0;
	}

	if ($child_of === 0)
		echo "<div id=\"menu\">\n";

	$SQL = "SELECT kategoriID, kategori, tkategoriID FROM kategorier WHERE tkategoriID = " . $child_of . "";
	$result = mysql_query($SQL) or die(mysql_error());
	$nItems = 0;
	while ($data = mysql_fetch_array($result)) {
		if ($nItems === 0)
			echo "<ul>\n";

		echo "<li>" . $data[1];
		menu($data[0]);
		echo "</li>\n"

		$nItems++;
	}

	if ($nItems > 0)
		echo "</ul>\n";

	if ($child_of === 0)
		echo "</div>\n";
}

echo menu(0);
```

och

```
#menu ul,
#menu li {
	list-style: none;
	margin: 0;
	padding: 0;
}

#menu ul li {
	padding-left: 20px;
}
```

 eller liknande för presentationen.

Permalänk: https://www.webforum.nu/p/2084865

## #14 — Asa, 2008-02-25T16:44Z

Det var nån annan dom tyckte div skulle vara bättre men självklart är listor bättre. Tackar för snabbt svar. Ska testa och återkommer.

Permalänk: https://www.webforum.nu/p/2084970

## #15 — Asa, 2008-02-25T18:07Z

Ta bort div helt och hållet. Det vore bra. Men det funkar iallafall finfint :) Du hade missat en ; på denna raden echo "\</li\>\\n"

Permalänk: https://www.webforum.nu/p/2084996

---

Tråden på webben: https://www.webforum.nu/amne/php/169288-meny-med-oändligt-undermenyer
