<ul><li>-liste mit php erstellen

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von ColoredScy, 18.11.2006.

  1. ColoredScy

    ColoredScy Thread Starter MacUser Mitglied

    Beiträge:
    78
    Zustimmungen:
    0
    MacUser seit:
    15.01.2004
    hallo...

    ich möchte aus einem mehrdimensionalen array eine html-liste erstellen (und bekomms weiss gott nicht auf die reihe, dass die tags an den richtigen stellen geschlossen werden).

    folgendermaßen sieht mein array (vereinfacht) aus:

    Code:
    $meinarray = array
      (
         "name" => anzuzeigender name,
         "pos"  => wie weit eingerückt es sein soll,
         "fist" => 1 oder 0,
         "last" => 1 oder 0
      );
    "first" und "last" sind jeweils "1", wenn der entsprechende eintrag der oberste/unterste in seiner hierarchie-ebene ist.

    das ganze soll dann als <ul> ausgegeben werden - in etwa so:
    Code:
    0: A
    1:   A.a
    2:   A.b
    3:     A.b.a
    4:     A.b.b
    5: B
    6:   B.a
    
    mein letzter entwurf dazu sieht wie folgt aus:
    PHP:
    $meinarray[] = array ("name"=>"A",     "pos"=>0"first"=>1"last"=>0);
    $meinarray[] = array ("name"=>"A.a",   "pos"=>1"first"=>1"last"=>0);
    $meinarray[] = array ("name"=>"A.b",   "pos"=>1"first"=>0"last"=>1);
    $meinarray[] = array ("name"=>"A.b.a""pos"=>2"first"=>1"last"=>0);
    $meinarray[] = array ("name"=>"A.b.b""pos"=>2"first"=>0"last"=>1);
    $meinarray[] = array ("name"=>"B",     "pos"=>0"first"=>0"last"=>1);
    $meinarray[] = array ("name"=>"B.a",   "pos"=>1"first"=>1"last"=>1);


    print_r($meinarray);

    function 
    menuout($i=-1) {  // vorbelegung mit -1, da ich unten gleich um eins erhöhe und damit auf 0 als ausgangswert komme

        
    global $meinarray;
        
        
    $go=true// keine schöne lösung, eine variable zum abbruch zu nehmen, aber ich war verzeifelt ;)
        
        
    while ($go) {
            
            
    $i++; // zähler erhöhen
        
            
    $j=$i;
            
            if (
    $meinarray[$i]['first']) { // jeder mit first gekennzeichnete eintrag startet mit einem <ul>
                
    echo "<ul>";    
            }

            echo 
    "<li>"// absolut jeder eintrag hat ein <li> vor seinem namen
            
    echo $meinarray[$i]['name'];
            
            if (isset(
    $meinarray[($i+1)]) // sollte es den nächsten eintrag geben (ist bei dem letzten arrayeintrag nicht der fall)...
                
    && $meinarray[($i+1)]['first']) // und sollte dieser ein "first" sein (und damit ein neuer unterpunkt)...
                    

                        
    $j menuout(($i)); // ... dann soll die rekursion los gehen
                                            // j enthällt jetzt den rückgabewert, bei dem der letzte
                    
    }
            
            echo 
    "</li>";


            if (
    $meinarray[$i]['last']) { // sollte dieser eintrag als der letzte seiner hierarchie merkiert sein,
                
    echo "</ul>";             // dann </ul> ausgeben und die rekursion beenden
                
    return $i;
                
    $go=false;
            }
            
            if (
    $j>$i) { $i=$j; } // sollte sich j erhöht haben, so ist eine rekursion gelaufen und dessen zähler wird übernommen
            
            
    if ($i==sizeof($meinarray)) { $go=false; }
            

        }

    }


    menuout();
    ...nur leider funktionierts nicht ganz. ich habe in diesem versuch komplett nur mit den first/last gearbeitet, da bei ersten versuchen mit der positionsnummer nur noch falscheres bei mir raus kam:mad: - vill. kann mir ja jemand die augen öffnen oder weiss nen brauchbaren link/tipp für mich (hab leider selber keinen gefunden).
     
  2. liquid

    liquid MacUser Mitglied

    Beiträge:
    3.144
    Medien:
    2
    Zustimmungen:
    111
    MacUser seit:
    21.07.2004
    … ich hab zwar keinen Plan von nix, aber im
    ersten Fenster steht "fist" statt "first" … das
    denke ich gehört nicht so … oder?

    Greetz,…
     
  3. ColoredScy

    ColoredScy Thread Starter MacUser Mitglied

    Beiträge:
    78
    Zustimmungen:
    0
    MacUser seit:
    15.01.2004
    war nur ein tippfehler - ich bitte das zu ignorieren ;)
     
  4. getraenkemarkt

    getraenkemarkt MacUser Mitglied

    Beiträge:
    688
    Zustimmungen:
    40
    MacUser seit:
    27.01.2006
    Warum so kompliziert?

    Code:
    <?php
    $name = array ('A', 'A.a', 'A.a.a', 'A.b', 'B');
    $position = array (1, 2, 3, 2, 1);
    
    $pos = 1;
    echo '<ul>';
    for ($x=0; $x<count($name); $x++) {
    	if ($position[$x] > $pos) {
    		echo '<ul>';
    		$pos = $position[$x];
    	}
    	echo '<li>' . $name[$x] . '</li>';
    	if ($position[$x+1] < $pos) {
    		echo '</ul>';
    		$pos = $position[$x+1];
    	}
    }
    echo '</ul>';
    ?>
     
  5. ColoredScy

    ColoredScy Thread Starter MacUser Mitglied

    Beiträge:
    78
    Zustimmungen:
    0
    MacUser seit:
    15.01.2004
    dankeschön ;)

    manchmal verbeisst man sich echt ganz schön in den holzweg, den man geht ;)
     
  6. ColoredScy

    ColoredScy Thread Starter MacUser Mitglied

    Beiträge:
    78
    Zustimmungen:
    0
    MacUser seit:
    15.01.2004
    nachtrag - deine lösung funktioniert leider auch nicht fehlerfrei :(
    und zwar immer dann, wenn ein sprung von mehr als einer ebene tiefe passert (kann zwar nicht beim tiefergehen vorkommen, aber beim zurückgehen).

    Bsp.:
    PHP:
    $name = array ('A''AA''AA''AAA''B');
    $position = array (12231);

    $pos 1;
    echo 
    '<ul>';
    for (
    $x=0$x<count($name); $x++) {
        if (
    $position[$x] > $pos) {
            echo 
    '<ul>';
            
    $pos $position[$x];
        }
        echo 
    '<li>' $name[$x] . '</li>';
        if (!isset(
    $position[$x+1]) || $position[$x+1] < $pos) {
            echo 
    '</ul>';
            if (isset(
    $position[$x+1])) { $pos $position[$x+1]; }
        }
    }
    echo 
    '</ul>';
    (die 2x isset() hab ich nur rein, um fehler beim letzten eintrag zu vermeiden)


    und noch ein nachtrag: ein untergeordnetes <ul> soll noch innerhalb des übergeordneten <li> stehen.

    Bsp.:
    Code:
    <ul>
      <li>AAAAAAA</li>
      <li>BBBBBBB
         <ul>
            <li>CCCCC</li>
            <li>DDDDD</li>
         </ul>
      </li>
    </ul>
     
    Zuletzt bearbeitet: 18.11.2006
  7. getraenkemarkt

    getraenkemarkt MacUser Mitglied

    Beiträge:
    688
    Zustimmungen:
    40
    MacUser seit:
    27.01.2006
    Mmh, das würde ich nicht mit so einem isset machen. Um in der Logik zu bleiben:
    Ich habe $position mit $pos einfach per größer/kleiner verglichen. Mach das doch einfach mit absoluten Werten, d.h. x Ebenen Unterschied und setze dann eben x mal </ul> ein.

    Dachte ich auch erst. Aber zumindest bei OmniWeb wurde dann noch ein zusätzlicher, häßlicher Spiegelstrich außen angezeigt. Schlag mal nach, ob <ul> in <ul> HTML-konform ist.

    Wenn Du noch Probleme damit haben solltest, meld Dich einfach nochmal.

    Viele Grüße
    Jan-Kaspar
     
  8. ColoredScy

    ColoredScy Thread Starter MacUser Mitglied

    Beiträge:
    78
    Zustimmungen:
    0
    MacUser seit:
    15.01.2004
    japp - <ul> innerhalb eines <li> ist konform. das ganze soll später mal ein popupmenü werden (klick mich ich bin ein beispiel).

    und genau damit fangen die probleme an, da ich dann nicht einfach durchzählen kann, weil immer mal ein </li> dazwishen sein kann, aber je nach menüstruktur eben nicht muss :(
     
  9. msslovi0

    msslovi0 MacUser Mitglied

    Beiträge:
    2.713
    Zustimmungen:
    115
    MacUser seit:
    20.03.2005
    Ich hab mich vor kurzem mal rangesetzt und die Navigation des XTC-Shops so umgearbeitet, das eine unsortierte, korrekt verschachtelte Liste hinten rauskommt.

    Da das zum Posten etwas viel Code ist, hier mal der Verweis auf meinen dazugehörigen Blogeintrag, vielleicht ist es ja eine Anregung:
    http://www.blogpotato.de/2006/11/16/xtc-und-semantisch-korrekter-code/

    Matt
     
  10. ColoredScy

    ColoredScy Thread Starter MacUser Mitglied

    Beiträge:
    78
    Zustimmungen:
    0
    MacUser seit:
    15.01.2004
    danke für deinen beitrag - ich konnte mein problem aber inzwischen dann doch lösen :)

    so müsste das jetzt (vereinfacht) lauten (die pos-angabe im array brauche ich gar nicht - komme allein mit dem first/last aus):
    PHP:
    $meinarray[] = array ("name"=>"A",     "pos"=>0"first"=>1"last"=>0);
    $meinarray[] = array ("name"=>"A.a",   "pos"=>1"first"=>1"last"=>0);
    $meinarray[] = array ("name"=>"A.b",   "pos"=>1"first"=>0"last"=>1);
    $meinarray[] = array ("name"=>"A.b.a""pos"=>2"first"=>1"last"=>0);
    $meinarray[] = array ("name"=>"A.b.b""pos"=>2"first"=>0"last"=>1);
    $meinarray[] = array ("name"=>"B",     "pos"=>0"first"=>0"last"=>1);
    $meinarray[] = array ("name"=>"B.a",   "pos"=>1"first"=>1"last"=>1);




    function 
    menuout($i=-1) {
        global 
    $meinarray;
        
        
        
    $go=true;
        
        while (
    $go) {
        
            
    $i++;
        
            
    $j=$i;
            

            if (
    $meinarray[$i]['first']) {
                echo 
    "<ul>";    
            }
        
            echo 
    "<li>".$meinarray[$i]['name'];
        
            
            if (isset(
    $meinarray[$i+1]) && $meinarray[$i+1]['first']) {
                
    $j menuout($i);
            }
            
            
            echo 
    "</li>";


            if (
    $meinarray[$i]['last']) {
                echo 
    "</ul>";
                if (isset(
    $j) && $j>$i) {
                    return 
    $j;
                } else {
                    return 
    $i;
                }
                
    $go=false;
            }
            
            
            if (
    $j>$i) { $i=$j; }
            
            if (
    $i==sizeof($meinarray)) { $go=false; }
            

        }

    }


    menuout();
     
    Zuletzt bearbeitet: 20.11.2006
Die Seite wird geladen...

Diese Seite empfehlen