Mehrdimensionalen Array in UL-Element ausgeben

Kipperlenny

Erfahrenes Mitglied
Moin Moin

Ich mal wieder mit einem absurden Problem an dem ich seit Tagen hänge...
Ich habe in der Datenbank (MySQL) die Seiten meiner HP gespeichert, diese möchte ich als Liste (<ul>) ausgeben. Bisher ganz einfach...
Nun können die Seiten allerdings Unterseiten einer anderen Seite sein, und die Unterseiten wiederum Unterseiten haben - ich weiß nicht wieviele Unterseiten und wieviele Ebenen es gibt.

Zuerst habe ich bei jeder Seite zugeschrieben unter welcher Seite sie steht und welches Level sie hat.
Dann allerdings erschien es mir einfacher eine neue Tabelle anzulegen die (mit einigen Beispielseiten) folgendermaßen aussieht:

| mid | sid |
1 | 2
2 | 8
3 | 7
3.1 | 1
3.1.1 | 2
3.1.2 | 2
3.2 | 1
4 | 7

mid zeigt dabei die Menustruktur an.
Dies kann ich dann in einem schönen Array speichern wo auch gleich die sid (ID der Seite) und der Text für den Link drin steht. Nun versuche ich das ganze in einer UL auszugeben, wobei jede Seite wieder eine <ul> enthält, in der falls Unterseiten vorhanden, diese drin stehen.

Folgendermaßen sieht es momentan aus:
http://vorlage.heerschaft.de/

HTML:
<ul id="list_to_sort">
<li id="1"><a href="index.php?sid=2">Login</a><ul></ul></li>
<li id="2"><a href="index.php?sid=8">unterindex1</a><ul></ul></li>
<li id="3"><a href="index.php?sid=7">unterindex</a>
       <ul>
       <li id="3.1"><a href="index.php?sid=1">Index Link</a>
       <ul>
             <li id="3.1.1"><a href="index.php?sid=2">Login</a>
       <ul></ul>
       </li>
       </ul>
</li>
<li id="3.1.2"><a href="index.php?sid=2">Login</a><ul></ul></li>
</ul>
</li>
<li id="3.2"><a href="index.php?sid=1">Index Link</a><ul></ul></li>
<li id="4"><a href="index.php?sid=7">unterindex</a><ul></ul></li>
</ul>

Und vereinfach dargestellt sollte es so RICHTIG aussehen:

HTML:
<ul>
<li>text</li><ul></ul></li>
<li>text
<ul>
<li>text</li><ul></ul>
</li>
</ul>

Nun ja, ich bekomme es nicht hin, so sieht momentan der Smarty Template Teil aus um das oben auszugeben:

PHP:
	<ul id="list_to_sort">
	{ foreach key=keye value=valuee from=$end }
		{ foreach key=keyv value=valuev from=$valuee }
			{ if $keye|count_dots eq 0 && $keye != 1}
				</ul></li><li id="{ $keye }"><a href="index.php?sid={ $keyv }">{ $valuev }</a><ul>
			{ elseif $keye|count_dots eq 0}
				<li id="{ $keye }"><a href="index.php?sid={ $keyv }">{ $valuev }</a><ul>
			{ elseif $keye|count_dots eq 1 }
				<li id="{ $keye }"><a href="index.php?sid={ $keyv }">{ $valuev }</a><ul>
			{ elseif $keye|count_dots eq 2 }
				<li id="{ $keye }"><a href="index.php?sid={ $keyv }">{ $valuev }</a><ul></ul></li></ul></li>
			{ /if }
		{ /foreach }
	{ /foreach }
	</ul></li></ul>

Völliger Schwachsinn also....

Einfach Fragestellung:
Wie gebe ich einen Mehrdimensionalen Array in einer Liste aus, schön mit Unterebenen und so?

Und den restlichen Teil den ich jetzt Poste können die Uninteressierten Leute ungelesen lassen, sind einfach meiner verschiedenen Lösungsansätze die ich wieder verworfen habe (um einen Array zusammenzubauen, mit unterschiedlichen Tabellenlayouts etc., den man hinterher schön ausgeben kann)

PHP:
function menu(&$db,&$tpl,$rights,$sid="") {
$menu = "";
$sql = "SELECT sid, link, under, level
		FROM seiten WHERE ";
		if($sid != "") $sql .= "sid NOT IN (".$sid.") AND "; 
		$sql .= "rights IN (".$rights.")
		ORDER BY under ASC,level DESC";
$result = $db->query($sql);
while($inhalt = $db->fetch_array($result)) {
	$menu[$inhalt['sid']]['level'] = $inhalt['level'];
	$menu[$inhalt['sid']]['link'] = $inhalt['link'];
}
print_r($menu);
die;
$tpl->assign("menu",$menu);
}

function menu(&$db,&$tpl,$rights,$sid="") {
	$sql = "SELECT sid,link FROM seiten"; // WHERE rights IN (".$rights.")";
	$result = $db->query($sql);
	while($links = $db->fetch_array($result)) {
		$link[$links['sid']] = $links['link']; 
	}
	$sql = "SELECT *
			FROM menu ORDER BY mid ASC,lvl DESC";
	$result = $db->query($sql);
	while($inhalt = $db->fetch_array($result)) {
		$menu[$inhalt['sid']]['lvl'] = $inhalt['lvl'];
		$menu[$inhalt['sid']]['link'] = $link[$inhalt['sid']];
	}
	$tpl->assign("menu",$menu);
}

function menu(&$db,&$tpl,$rights,$sid="") {
	$sql = "SELECT sid,link FROM seiten"; // WHERE rights IN (".$rights.")";
	$result = $db->query($sql);
	while($links = $db->fetch_array($result)) {
		$link[$links['sid']] = $links['link']; 
	}
	$sql = "SELECT *
			FROM menu ORDER BY mid ASC";
	$result = $db->query($sql);
	$i = 1;
	$j = 1;
	while($inhalt = $db->fetch_array($result)) {
		$menu = array();
		$menu[$inhalt['sid']] = $link[$inhalt['sid']];
		/*if($inhalt['lvl'] > 0) {
		$end[$i][$inhalt['sid']]['lvl'] = $inhalt['lvl'];
		$end[$i][$inhalt['sid']]['link'] = $link[$inhalt['sid']];
		} else*/
		$end[$inhalt['mid']] = $menu;
	}
$tpl->assign("end",$end);
}

Hoffe mal mir wird geholfen...

lenny
 
Zuletzt bearbeitet:
Vielen Dank schon mal für die erste Antwort (wo auch immer sie hin ist, aber eben war hier eine, habe sie auch per Email bekommen...., drin stand was mit "Nested Sets").

Werde mir das mal beibringen, scheint mir recht kompliziert - hilft mir dann aber nur bei der DB Struktur.

Eigentlich ist die Frage ja viel einfacher - wie bilde ich mehrdimensionale Arrays als Liste ab (und das nicht mit print_r *gg*).

Lenny

PS: Das hier ist KEIN Doppelpost, eben war hier noch eine Antwort
 
Zurück