php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 06.08.2008, 23:17  
Neuer Benutzer
 
Registriert seit: 06.08.2008
Beiträge: 3
kipperlenny befindet sich auf einem aufstrebenden Ast
Standard Mehrdimensionalen Array in UL ausgeben

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.

So sieht es momentan aus:
http://vorlage.heerschaft.de/

HTML-Code:
<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-Code:
<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-Code:
    <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-Code:
/*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

PS: Nested Sets habe ich mir schon durchgelesen, würde mir aber letztendlich nur bei der DB Struktur helfen und nicht bei dem Problem "Wie gebe ich einen Mehrdimensionalen Array als ul aus".

PPS: Was mir gerade noch einfällt, hilft mir rekursives denken hierbei weiter?
kipperlenny ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 06.08.2008, 23:20  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

PPS: ja.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 06.08.2008, 23:24  
Neuer Benutzer
 
Registriert seit: 06.08.2008
Beiträge: 3
kipperlenny befindet sich auf einem aufstrebenden Ast
Standard

Auch wenn ich unter "PHP für Fortgeschritten" schreibe - wie hilft es mir weiter?
Das Problem ist nicht das einfach ausgeben mit Spiegelstrichen davor welche Ebene wir gerade sind (was ich locker hinbekommen würde) sondern das ausgeben als <ul> mit <ul>s als Ebenen...
kipperlenny ist offline   Mit Zitat antworten
Alt 06.08.2008, 23:46  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Für jedes Subarray gibst Du <ul> aus, durchläufst die Elemente (Augabe mit <li>), und abschließend </ul>
Elemente die selbst ein Array sind: <ul> ...
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 07.08.2008, 01:02  
Neuer Benutzer
 
Registriert seit: 06.08.2008
Beiträge: 3
kipperlenny befindet sich auf einem aufstrebenden Ast
Standard

Aber jedes <li> hat vor dem </li> ein <ul></ul>
Und falls es Unterseiten hat stehen die da drin - falls es keine hat, hat es das trotzdem.
kipperlenny ist offline   Mit Zitat antworten
Alt 07.08.2008, 01:18  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Dann machst Du was falsch. Ich sag doch: Nur Elemente die selbst ein Array sind erzeugen: <ul> ... durch rekursiven Aufruf der Funktion

Vereinfachtes Beispiel:

PHP-Code:
<?  
$aMenu 
= array (
                
'Punkt 1' => 'Punkt 1',
                
'Punkt 2' => array (
                                   
'Punkt 2.1' => 'Punkt 2.1' ,
                                   
'Punkt 2.2' => 'Punkt 2.2' ,
                                   
'Punkt 2.3' => array (
                                                        
'Punkt 2.3.1' => 'Punkt 2.3.1' ,
                                                        )
                                   ),
                
'Punkt 3' => array (
                                   
'Punkt 3.1' => 'Punkt 3.1' ,
                                   
'Punkt 3.2' => 'Punkt 3.2' ,
                                   ),
                
'Punkt 4' => 'Punkt 4',
                );
              
function 
showmenu ($aStruct)
  {
  foreach (
$aStruct as $sKey => $mValue)
    {
    if (
false == is_array ($mValue))
      {
      echo 
"\n".'<li>' .$sKey'</li>';
      }
    else
      {
      echo 
"\n".'<li>' .$sKey "\n" '<ul>'
      
showmenu ($mValue);
      echo 
"\n" '</ul>' "\n".'</li>';
      }
    }
  }
  
showmenu ($aMenu);
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (07.08.2008 um 01:28 Uhr).
nikosch ist offline   Mit Zitat antworten
Alt 07.08.2008, 09:14  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard

@nikosch
Bei dir fehlen die äussersten <ul>. So sind auch diese vorhanden:
PHP-Code:
function showmenu ($aStruct) { 
    echo 
"<ul>\n";
    foreach (
$aStruct as $sKey => $mValue) { 
        if (
false == is_array ($mValue)) { 
        echo 
"<li>$sKey</li>\n"
        } 
        else {
            
showmenu($mValue); 
        } 
    }
    echo 
"</ul>\n"

__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Alt 07.08.2008, 12:58  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Dein Quelltext stimmt aber auch nicht. Nicht nur dass die Oberpunkte fehlen (2 und 3), auch bei Dir fehlen paar <ul>'s (jedenfalls im Vergelich zu meiner Struktur):
Code:
<ul>
<li>Punkt 1</li>

<li>Punkt 2.1</li>
<li>Punkt 2.2</li>

    <li>Punkt 2.3
<ul>
<li>Punkt 2.3.1</li>
</ul>

</li>
<li>Punkt 3.1</li>
<li>Punkt 3.2</li><li>Punkt 4</li>
</ul>
Meine:
Code:
(<ul>)
<li>Punkt 1</li>
<li>Punkt 2
    <ul>
    <li>Punkt 2.1</li>
    <li>Punkt 2.2</li>
    <li>Punkt 2.3
        <ul>
        <li>Punkt 2.3.1</li>
        </ul>
    </li>
    </ul>
</li>

<li>Punkt 3
    <ul>
    <li>Punkt 3.1</li>
    <li>Punkt 3.2</li>
    </ul>
</li>
<li>Punkt 4</li>
(</ul>)
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (07.08.2008 um 13:01 Uhr).
nikosch ist offline   Mit Zitat antworten
Alt 07.08.2008, 14:00  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Ich weiss nicht, mit wie du das getestet hast, bzw. mit was für einem Code. Wenn ich diese Funktion mit deinem Array als Parameter aufrufe, dann erhalte ich folgenden Quellcode:
Code:
<ul>
<li>Punkt 1</li>
<ul>
<li>Punkt 2.1</li>
<li>Punkt 2.2</li>
<ul>
<li>Punkt 2.3.1</li>
</ul>
</ul>
<ul>
<li>Punkt 3.1</li>
<li>Punkt 3.2</li>
</ul>
<li>Punkt 4</li>
</ul>
Noch etwas übersichtlicher wird der Quellcode mit folgender Funktion, der auch die Oberpunkte ausgibt:
PHP-Code:
function showmenu ($aStruct$ident 0) {
    
$id_str '';
    for(
$i 0;$i $ident;$i ++){
        
$id_str .= "\t";
    }
    echo 
"$id_str<ul>\n";
    foreach (
$aStruct as $sKey => $mValue) { 
        echo 
"$id_str\t<li>$sKey</li>\n"
        if (
false != is_array ($mValue)) { 
            
showmenu($mValue$ident 1); 
        } 
    }
    echo 
"$id_str</ul>\n"

Code:
<ul>
	<li>Punkt 1</li>
	<li>Punkt 2</li>
	<ul>
		<li>Punkt 2.1</li>
		<li>Punkt 2.2</li>
		<li>Punkt 2.3</li>
		<ul>
			<li>Punkt 2.3.1</li>
		</ul>
	</ul>
	<li>Punkt 3</li>
	<ul>
		<li>Punkt 3.1</li>
		<li>Punkt 3.2</li>
	</ul>
	<li>Punkt 4</li>
</ul>
__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Alt 07.08.2008, 14:18  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
© & Gruss
L
Heißt das jetzt, dass kipperlenny deinen Code nicht nutzen darf?
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Turnierbaum aus array erstellen kingflo PHP-Fortgeschrittene 11 30.07.2008 11:32
textdatei(tab getrennt) in array ausgeben schnurzli PHP Tipps 2006 7 10.10.2006 22:01
array richtig sortieren, dann ausgeben Heart PHP Tipps 2006 5 28.04.2006 20:23
Array auslesen andrew22 PHP Tipps 2006 3 21.01.2006 23:06
Array Formatierung PHP Tipps 2006 3 17.01.2006 19:12
Menü mit Unterpunkten supertramp Beitragsarchiv 7 18.10.2005 22:40
Problem beim vergleichen von 2 Arrays PHP Tipps 2005-2 1 06.10.2005 14:25
Array ausgeben PHP Tipps 2005-2 1 14.07.2005 12:53
Array füllen und ausgeben PHP Tipps 2005 6 24.02.2005 14:33
[Erledigt] Mehrdimensionales Array in eindimensionales Array umwandeln PHP-Fortgeschrittene 3 03.01.2005 22:31
Abfrage mit id aus anderer Tabelle suter PHP Tipps 2004-2 15 16.12.2004 14:25
[Erledigt] Array ausgeben PHP Tipps 2004-2 4 05.12.2004 00:53
Array: Nur einen bestimmten Teil ausgeben PHP Tipps 2004 17 25.10.2004 14:29
[Erledigt] Frage zu mehrdimensionalen Array PHP-Fortgeschrittene 6 30.08.2004 14:10

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php mehrdimensionales array ausgeben, php menü array, http://www.php.de/php-fortgeschrittene/46559-mehrdimensionalen-array-ul-ausgeben.html, php array menü, php array to ul, mehrdimensionales array ausgeben php, php array schön ausgeben, php array mehrdimensional ausgeben, array to ul, php array to <ul>, php array menü ausgeben, mehrdimensionale arrays ausgeben php, php array ul, array schön ausgeben, php mehrdimensionale arrays ausgeben, menü php array, php sql array ausgeben, php array ul li, php array to ul li, array to ul li

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:32 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum