möchte verzeichnisbaum erstellen -> schleifenproblem
der-daniel
- php
hallo auch,
ich verzweifel an ner schleife.
ich habe in einer datenbank einen verzeichnisbaum abgebildet.
jeder ordner hat eine id und ein subid. die subid ist die id des übergeordneten elementes.
folgende struktur:
/
sieht in der db so aus:
id|name |subid |
--+------------------+------+
1 |ordner 1 |0 |
2 |ordner 2 |0 |
3 |ordner 3 |0 |
4 |subordner 2.1 |2 |
5 |subordner 2.2 |2 |
6 |subordner 2.1.1 |4 |
7 |subordner 2.1.1.1 |6 |
so nun hab ich mir das skript so gedacht:
1. alle ordner mit subid 0 via while-schleife
erstellen wenn noch nicht vorhanden und
gleich reinwechseln.
2. alle ordner deren subid die aktuelle id ist
mit der gleichen methodik anlegen
3. wieder ein verzeichnis höher wechseln, damit der pfad stimmt
für den nächsten while-durchlauf
und hier hakts bei mir. das läuft gut bis zur zweiten ordnerebene (subordner 2.1) aber alles was noch tiefer ist wird nicht angelegt.
ich weiß nicht, wie ich das angehen soll, damit ich unendlich tiefe strukturen anlegen kann. mit meiner aktuellen emthodik schliesse ich natürlich alle unterstrukturen ab der 2. ebene aus.
ich könnte zwar meine skript einfach hundertmal inneinander verschachteln, aber das macht ja auch keinen sinn...
habt ihr da ideen dazu?
danke für eure hilfe,
der-daniel
hier mein gekürzter code zum besseren verständnis:
<-- mysql-abfrage für hauptordner mit id 0 -->
while (mysql_fetch_object)
{
if ($ordner-id == "0")
{
if (!@ftp_chdir($ftp, $ordner))
{
ftp_mkdir($ftp, $ordner);
ftp_chdir($ftp, $ordner);
<-- mysql-abfrage für subordner mit subid 0 -->
while (mysql_fetch_object)
{
if (!@ftp_chdir($ftp, $subordner))
{
ftp_mkdir($ftp, $subordner);
HIER MÜSSTE ICH WIEDER IN DEN ORDNER UND WIEDER CHECKEN AUF SUBORDNER
WEISS ABER NICHT WIE ICH DAS MACHEN SOLL UM UNENDLICHE STRUKTUREN
ABBILDEN ZU KÖNNEN
}
}
ftp_cdup($ftp);
}
ftp_cdup($ftp);
}
}
Lieber Daniel,
ich verzweifel an ner schleife.
einen Verzeichnisbaum abzubilden hört sich verdächtig nach einer rekursiven (also sich mittendrin selbst aufrufenden) Funktion an.
Ohne Datenbank und im regulären Dateisystem benutze ich immer eine Funktion die ungefähr so geht:
"Verzeichnis_Inhalt" ($pfad)
1.) lege ein Array an
3.) öffne Verzeichnis zum lesen
4.) gehe jeden Eintrag (außer '.' und '..') durch und tue folgendes
4.a) wenn Eintrag eine Datei ist (is_file), Array um den Eintrag (samt Pfad) erweitern
4.b) wenn Eintrag ein Verzeichnis ist (is_dir), dann
I.) diese Funktion hier ("Verzeichnis_Inhalt") mit Eintrag samt Pfad als Parameter wiederum aufrufen
II.) den Rückgabewert in das Array hineinsetzen
5.) Array als Rückgabewert zurückgeben
In 4.b) ruft sich die Funktion selbst wieder auf, daher nennt man das eine rekursive Funktion. Vielleicht lässt sich das Prinzip auf Deine Herangehensweise übertragen?
Liebe Grüße aus Ellwangen,
Felix Riesterer.