RomanD: Baumstruktur erzeugen

Hi,

ich habe ein eindimensionales Array aus Verzeichnis-Pfaden.

$pfade = array(
"Pfad1",
"Pfad2",
"Pfad3/Ebene1",
"Pfad3/Ebene2",
"Pfad3/Ebene3/Ebene1",
"Pfad4/Ebene2",
"Pfad5");

Daraus möchte ich eine Ausgabe als Baumstuktur erzeugen, z.B. so

Pfad1
Pfad2
Pfad3
  Ebene1
  Ebene2
  Ebene3
    Ebene1
Pfad4
  Ebene2
Pfad5

Hat jemand ne Idee wie ich das bewerkstelligen könnte?

  1. Lieber RomanD,

    ja, ich hätte da eine.

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hi,

      haette da schnell eine Idee die ich mal hier rein werfe.

      Diese Struktur hast du schon, oder?

      $pfade = array(
      "Pfad1",
      "Pfad2",
      "Pfad3/Ebene1",
      "Pfad3/Ebene2",
      "Pfad3/Ebene3/Ebene1",
      "Pfad4/Ebene2",
      "Pfad5");

      $pfadeFlipped = array_flip($pfade); // vertauscht key und values
      ksort($pfadeFlipped); // sortieren nach den Schluesseln
      foreach($pfadeFlipped as $path => $value)
      {
           echo str_repeat('\t', substr_count($value, '') // pro '/' einen Tabulator ausgeben ... fuer html brauchst hier was anderes, z.B. &nbsp., oder besser <span style="margin-left:X"> ... kriegst schon hin wie ich das meine, oder?

      echo substr($value, -strrpos($value, '/')); // gibt alles nach dem letzen Slash aus
      }

      Ungetestet, aber als Konzept okay ... bequeme Loesung, evtl. nicht hoch performant ... aber Rekursion is auch alles andere als performant ...

      Hope it helps

      1. Hi,

        getestet und Bug gefunden ... hab in der Schleife $value statt $path nach '' statt '/' durchsucht, was natuerlich falsch ist.

        Das hier funktioniert nach dem Prinzip wie es sein soll, falls ich dich richtig verstanden habe.

        Wie gesagt, das <br> und &nbsp; is nicht gut, aber bei "quick and dirty" erlaubt.

        $pfadeFlipped = array_flip($pfade); // vertauscht key und values
        ksort($pfadeFlipped); // sortieren nach den Schluesseln
        foreach($pfadeFlipped as $path => $value)
        {
         echo '<br>'; // neue Zeile fuer jeden Pfad
         echo str_repeat('&nbsp;&nbsp;&nbsp;', substr_count($path, '/')); // 3 Leerzeichen pro '/'
         echo substr($value, -strrpos($value, '/')); // gibt alles nach dem letzen Slash aus
        }

  2. Hello,

    Hi,

    ich habe ein eindimensionales Array aus Verzeichnis-Pfaden.

    $pfade = array(
    "Pfad1",
    "Pfad2",
    "Pfad3/Ebene1",
    "Pfad3/Ebene2",
    "Pfad3/Ebene3/Ebene1",
    "Pfad4/Ebene2",
    "Pfad5");

    Daraus möchte ich eine Ausgabe als Baumstuktur erzeugen, z.B. so

    Pfad1
    Pfad2
    Pfad3
      Ebene1
      Ebene2
      Ebene3
        Ebene1
    Pfad4
      Ebene2
    Pfad5

    Hat jemand ne Idee wie ich das bewerkstelligen könnte?

    Durch Rekursion mit Übergabeparameter bzw. referenzwertweitergabe.
    BTW: Deine Begriffswahl ist verkehrt herum.
         Ebene 1 ist üblicherweise näher an der Wurzel, als Ebene 3...

    Angenommen, im "Array" mit dem Namen $_baum stehen die Daten

    function make_list($_baum, $ebene)
    {
      foreach($_baum as $subline_no => $entry)
      {
        if(is_array($enty)
        {
          $list .= make_list($enty, $ebene+1);
        }
        else
        {
          $list .= "<li class="entry"".($ebene % 2)." ebene$ebene">".htmlspecialchars($entry)."</li>\n";
        }

    return $list;
      }
    }
    #----------------------------------------------------

    $ebene = 0;

    echo make_list($_baum, $ebene);

    Ich hoffe, dass ich mich nicht geirrt habe.

    Schau Dir das resultierende HTML an.
    Der Rest sollte dann über CSS steuerbar sein.

    Du brauchst eine Klasse für even und odd und eine für den indent.
    Statt des <li> wäre ggf. auch <p> denkbar (bitte nicht schlagen *g*).

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  3. Hallo,

    ich habe ein eindimensionales Array aus Verzeichnis-Pfaden.

    $pfade = array(
    "Pfad1",
    "Pfad2",
    "Pfad3/Ebene1",
    "Pfad3/Ebene2",
    "Pfad3/Ebene3/Ebene1",
    "Pfad4/Ebene2",
    "Pfad5");

    wie Tom schon schrieb, sowas geht mit einer Rekursion. Genau genommen brauchst Du dazu zwei Funktionen: eine, die sich rekursiv immer wieder selbst aufruft, durch den Verzeichnisbaum Baum frisst und die Darstellung übernimmt und eine zweite (Hilfsfunktion), die für jede Verzeichnisebene die Unterebenen ermittelt.

    Viele Grüße,
    Hotte