Array als dynamische Struktur

Neurodeamon

Erfahrenes Mitglied
Sitze seit geraumer Zeit an einem Problem und sehe mal wieder den Wald vor lauter Bäumen nicht. Zum Hintergrund -> Ich lese eine Struktur aus einer sqlite Datenbank (Felder "key" und "value") und schreibe diese in ein Array mit Ebenen die sich durch die länge des keys ergeben - eine zahl = eine ebene, zwei zahlen = zwei ebenen usw:
Code:
Array
(
    [0] => Array
        (
            [0] => One
            [1] => Two
            [2] => Three
            [3] => Four
        )

    [1] => Array
        (
            [1.0] => TwoOne
        )

    [2] => Array
        (
            [1.0.0] => TwoOneOne
            [1.0.1] => TwoOneTwo
            [1.1.0] => TwoTwoOne
            [1.1.1] => TwoTwoTwo
        )

    [3] => Array
        (
            [1.1.0.0] => TwoTwoOneOne
        )

)

Jetzt möchte ich diese als HTML-Liste ausgeben. Die soll wie folgt aussehen:
HTML:
<ul>
    <li>One</li>
    <li>Two</li>
        <ul>
            <li>TwoOne</li>
                <ul>
                    <li>TwoOneOne</li>
                    <li>TwoOneTwo</li>
                    <li>TwoTwoOne</li>
                        <ul>
                            <li>TwoTwoOneOne</li>
                        </ul>
                    <li>TwoTwoTwo</li>
                </ul>
        </ul>
    <li>Three</li>
    <li>Four</li>
</ul>

Der Aufruf müßte - wenn ich nicht ganz verkehrt liege - rekursiv erfolgen.
Meine Versuche waren bisher nicht von Erfolg gekrönt.
Jegliches Feedback sollte weiterhelfen.
 
Zuletzt bearbeitet:
Moin,

an ähnlichen Sachen habe ich mich auch schon des Öfteren probiert.:-(

Irgendwann hab ich dann die rechte Lichtung durchs Dickicht gefunden....sie hiess XML :)
Was sonst wäre besser geeignet für Baumstrukturen, man fügt die Knoten dort ein, wo sie hinsollen und muss nicht umständlich herumzählen, wieviel schliessende Tags man noch braucht :-) ...Rekursion braucht man auch nicht.

Falls du nen Beispiel brauchst, sag Bescheid ;)
 
OK, hier isses:
PHP:
<?php
$arr=array
(
     '0' => array
        (
            "0" => 'One',
            "1" => 'Two',
            "2" => 'Three',
            "3" => 'Four'
        ),

    '1' => array
        (            
            '1.0' => 'TwoOne',
            '1.1' => 'TwoTwo'
        ),

 '2' => array
        (
            '1.0.0' => 'TwoOneOne',
            '1.0.1' => 'TwoOneTwo',
            '1.1.0' => 'TwoTwoOne',
            '1.1.1' => 'TwoTwoTwo'
        ),

    '3' => array
        (
            '1.1.0.0' => 'TwoTwoOneOne'
        )
);

$doc = new DOMDocument("1.0");

  //Prefix für eine gültige ID
$prefix='item_';

foreach($arr as $k => $v)
{
  foreach($v as $kk => $vv)
    {
        //LI erstellen
      $item=$doc->createElement("li");
      
        //Text einfügen
      $item->appendChild($doc->createTextNode($vv));
      
        //id-Attribute setzen, um Element später wiederzufinden
      $item->setAttribute('id',$prefix.$kk);
      
        //id-Attribut als DOM-ID registrieren
      $item->setIdAttribute('id',true);
        
        //Elternelement 
      $parent= ($k==0)
                ? $doc
                : $doc->getElementById(preg_replace('|\.\d$|',
                                                    '',
                                                    $item->getAttribute('id')));
      
      if($parent)
        {
            //UL in Elternelement einfügen, falls noch nicht vorhanden
          if(!$parent->getElementsByTagName('ul')->item(0))
            {
              $parent->appendChild($doc->createElement('ul'));
            }
            //LI einfügen
          $parent->lastChild->appendChild($item);
        }
    }
}

  //fertsch :)
echo $doc->saveHTML().'<hr><pre>'.htmlentities($doc->saveHTML()).'</pre>';

?>

Das meiste wird dir sicher von JS her bekannt sein :)
 
Zuletzt bearbeitet:
Zurück