Stephan: Verzeichnisstruktur einlesen und in Arrays verwalten

Hallo,

Entschuldigt bitte, wenn ich Euch mal wieder mit dem (wohl leidigen) Thema "Verzeichnis einlesen" bemühen muss, aber ich komme einfach nicht weiter, bzw. genauer gesagt, ich habe eine Lösung, die zwar funktioniert, mir aber nicht gefällt:

Ich möchte aus einer Verzeichnisstruktur ein Menü mit Untermenüs aufbauen.

Aktuell geschieht das folgendermassen, dass über eine PHP-Datei ein Ausgangsverzeichnis eingelesen und am Bildschirm ausgegeben wird. Klickt man nun auf einen Ordnernamen, dann wird die PHP-Datei mit dem aktuellen Ordnernamen aufgerufen, die jeweilige Struktur eingelesen und als Menü am Bildschirm aus. Klickt man nun wiederum auf einen Ordnernamen, dann wird die PHP-Datei mit dem aktuellen Ordnernamen wieder aufgerufen, die jeweilige Struktur wieder eingelesen und als Menü ausgegeben ...usw...

Meine Vorstellungen gehen nun in die Richtung, die gesamte Verzeichnisstruktur unterhalb eines Ausgangsverzeichnisses in eigene Arrays einzulesen, sie danach in ein Javascript-Array umzuwandeln und das Menü über Javascript ausgeben zu lassen.

Über folgende Funktion kann ich das Ausgangsverzeichnis einlesen:

function VerzeichnisEinlesen ($Verzeichnis)
{
  $VerzeichnisZeiger = @opendir ($Verzeichnis);

while ($Element = @readdir ($VerzeichnisZeiger))
  {
    if ($Element != "." && $Element != "..")
    {
      if (is_dir ("$Verzeichnis/$Element"))
        $ArrayVerzeichnisse [] = "$Verzeichnis/$Element";
    }
  }

return $ArrayVerzeichnisse [];
}

Wenn ich die Funktion nun beiepielsweise mit $ArrayVerzeichnisse [] = VerzeichnisEinlesen ("/Bilder") aufrufe und sich im Ordner "Bilder" zunächst 3 Unterordner namens "Ordner1", "Ordner2" und "Ordner3" befinden, dann habe ich danach folgende Struktur:

Bilder
  |
  +- Ordner1
  |
  +- Ordner2
  |
  +- Ordner3

Nun kann ich dieses Array von 0 bis zu seiner Länge (= Anzahl der enthaltenen Elemente) durchlaufen lassen, um dann die ganze Prozedur für die einzelnen Elemente durchführen zu lassen:

for ($i = 0; $i < count ($ArrayVerzeichnisse); $i++)
  $ArrayVerzeichnisse [][] = VerzeichnisEinlesen ($ArrayVerzeichnisse [$i]);

Und hier beginnen meine Probleme:

Woher soll die Funktion wissen, wieviele Dimensionen das übergebene Array hat ?
Ich könnte zwar sicherlich alle Ordner durchzählen und wüsste dann, wieviele Dimensionen ich pro Element benötige, doch dies wäre reichlich unprofessionell.

Ich hoffe, Ihr versteht, was ich meine :o)

Mir geht es darum, die Funktion "VerzeichnisEinlesen" so zu erweitern, dass ein beliebiger Ausgangsordner mit einer unbekannt tief verzweigten Ordnerstruktur komplett in einzelne Arrays abgelegt wird.

Das zweite Problem ist, wie ich diese Arrays dann richtig in Javascript-Arrays umwandle.

Hoffentlich könnt Ihr mir weiterhelfen.

Gruss, Stephan

  1. Hallo Stephan!

    Woher soll die Funktion wissen, wieviele Dimensionen das übergebene Array hat ?
    Ich könnte zwar sicherlich alle Ordner durchzählen und wüsste dann, wieviele Dimensionen ich pro Element benötige, doch dies wäre reichlich unprofessionell.

    Setze doch einfach das Ausgangsverzeichnis in einem Zähler als 0. Dan schickst du deine Funktion auf die Suche, bis sie nix neues mehr findet.

    Knkret würde das heißen, daß du sie jeweils in das erste Verzeichnis schickst, das sie findet. Da du das ja auch gleichzeitig protokollierst weißt du, wo die Funktion schon war. Oro Verzeichnis zählst du also mittels is_dir() die Verzeichnisse. Ist dieser Wert irgendwann 0 weißt du, das du das Verzeichnis wieder verlassen kannst. Beim Schritt zurück überprüfst du, ob die dann zurückgegebenen Verzeichnisnamen schon in deinem Protokoll vorhanden sind. Wenn nein gehst du wieder ins erste rein, wenn ja eine Ebene zurück. Immer so weiter. Kriegst du auch auf Ebene null keinen neuen Verzeichnisse mehr ausgelesen, weißt du, daß du den gesamten Verzeichnisbaum durchlaufen bist.

    Das zweite Problem ist, wie ich diese Arrays dann richtig in Javascript-Arrays umwandle.

    Davon habe ich leider gar keine Ahnung.

    Gruß

    Matthias

    --
    ss:| zu:| ls:[ fo:| de:] va:) ch:? sh:) n4:( rl:( br:> js:| ie:% fl:) mo:}
    http://www.makaio.de/quotations
    1. Hallo Matthias,

      Danke für Deine rasche Antwort.

      Dein Ansatz klingt schon recht plausibel, d.h. ich müsste mit Schaltern arbeiten:

      function VerzeichnisEinlesen ($Verzeichnis, $Schalter)
      {
        if ($Schalter == 0)
        {
          /*
            [1]
          */
        }
        else
        {
          /*
            [2]
          */
        }
      }

      Zu [1]

      Wenn der Schalter gleich 0 ist, dann würde ich eine neue "Schublade" anfügen:

      Wenn ich zunächst nur die 1. Ebene unterhalb des Ordners "Bilder" einlese, dann hätte ich nur eine Dimension:

      $ArrayVerzeichnisse []

      Dieses Array würde ich dann mit $ArrayVerzeichnisse [] = array () um eine weitere Dimension erweitern...

      Nur muss ich ja die Funktion mit dem dynamisch dimensionirten Array bedienen und diese Dimension weiss ich ja nicht.

      Zu [2]

      Hier würde ich dann das jeweilige Array-Element mit den darunter liegenden Ordnern "füttern".

      Boah, mir raucht schon der Kopf :-(

      Keine Ahnung, wie ich das umsetzen soll...

      Gruss, Stephan.

      1. Hallo Stephan!

        Ich würde mich nicht auf einen Schalter beschränken, der hat nur an/aus. Nimm' doch stattdessen eine Zählvariable, die die derzeitige Verzeichnistiefe enthält (0 ... x).

        Allerdings fängt jetzt auch mir der Kopf zu rauchen an, wenn ich drüber nachdenke, wie ich es noch genauer erklären könnte ;-)

        Gruß

        Matthias

        --
        ss:| zu:| ls:[ fo:| de:] va:) ch:? sh:) n4:( rl:( br:> js:| ie:% fl:) mo:}
        http://www.makaio.de/quotations
        1. Hallo Matthias,

          Habe nun folgenden Code angelegt:

          $EbenenTiefe = 0;

          function VerzeichnisEinlesen ($Verzeichnis)
          {
            $Verzeichnis = array ();

          $VerzeichnisZeiger = @opendir ($Verzeichnis);

          while ($Element = @readdir ($VerzeichnisZeiger))
            {
              if ($Element != "." && $Element != ".." && (is_dir ("$Verzeichnis/$Element"))
                $ArrayVerzeichnisse [] = "$Verzeichnis/$Element";
              else
              {
                if (is_file ("$Verzeichnis/$Element"))
                  $Vorschau = true;
              }
            }

          if ($Vorschau == false)
              $EbenenTiefe = $EbenenTiefe + 1;
          }

          $ArrayVerzeichnisse = VerzeichnisEinlesen ("pic/pic/klein/");

          for ($i = 0; $i <= $EbenenTiefe; $i++)
          {
            for ($i = 0; $i < count ($ArrayVerzeichnisse); $i++)
              $ArrayVerzeichnisse = VerzeichnisEinlesen ($ArrayVerzeichnisse [$i]);
          }

          Es dürfte schon in Deine Richtung gehen (denke ich mir mal), allerdings bin ich mir hier noch extrem unschlüssig... :o)

          Die Variable $EbenenTiefe gibt wieder, wieviele Verzeichnisstrukturen ich habe und bildet die äussere Schleife.

          Aber ob das so klappt, mag ich sehr bezweifeln... *knirsch*

          Stephan