Baumstruktur erzeugen
RomanD
- php
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?
Lieber RomanD,
ja, ich hätte da eine.
Liebe Grüße aus Ellwangen,
Felix Riesterer.
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.  ., 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
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 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(' ', substr_count($path, '/')); // 3 Leerzeichen pro '/'
echo substr($value, -strrpos($value, '/')); // gibt alles nach dem letzen Slash aus
}
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
Pfad5Hat 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
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