Enrico: Dynamische Erzeugung zweier abh. Select-Felder

Sodalla, wieder einmal benötige ich Eure Hilfe.

Ein Verzeichnis samt Unterverzeichnisse auszulesen und die zurückgegebenen Pfadangaben zu kürzen funktioniert mittlerweile - endlich - einwandfrei.

Die ("bereinigten") Angaben sehen beispielsweise folgendermassen aus:

Enrico
Enrico131Tina
Familie_2Big1Brother21Christian
Familie_2Big1Brother21Christian131SchwAEgerin1Irmgard
Freunde_Armin
Freunde_Armin131Manuela
Freunde_Manuela
Freunde_Marita
Haustiere_Hamster12Snoopy2
Haustiere_Kater12Blacky2
Haustiere_Kater12Peterl2

Bitte nicht über die verwendeten Zahlen wundern. Diese haben nur den Zweck, später gegen bestimmte Zeichen ersetzt zu werden und wurden nur eingebaut, um Schwierigkeiten mit den Ordnernamen durch Verwendung von Sonderzeichen zu vermeiden.

Der Vollständigheit halber und um des besseren Verständnisses Willen:

Enrico131Tina                     wird zu   Enrico & Tina
Familie_2Big1Brother21Christian   wird zu   Familie_"Big Brother" Christian

Nun geht es mir darum, die zurückgegebenen und "bereinigten" Angaben zu zerlegen und in Select-Felder für die Auswahl der gewünschten Fotogalerie einzubauen.

Füllungen der voneinander abhängigen Select-Felder nach der Formatierung der "bereinigten" Pfadangaben:

Select-Feld 1 -+- Select-Feld 2
Enrico         |
Familie        | "Big Brother" Christian
               | "Big Brother" Christian & Schwägerin Irmgard
Freunde        | Armin
               | Armin & Manuela
               | Manuela
               | Marita
Haustiere      | Hamster "Snoopy"
               | Kater "Blacky"
               | Kater "Peterl"

Prinzipiell geht es mir nun darum, die Pfadangabe anhand des Trennzeichens "_" zu splitten, den vorderen Teil - sofern im ersten Select-Feld noch nicht vorhanden - dem ersten Select-Feld zuzuordnen und den Rest, als aufzuzeigender Inhalt, sobald die entsprechende Auswahl im ersten Select-Feld getroffen wurde, dem zweiten Select-Feld zuzuordnen.

Nur, wie mache ich das ?

Das Script zum Einlesen und Bereinigen der Pfadangaben sieht wie folgt aus:

<?php

function VerzeichnisEinlesen ($Ausgangsverzeichnis)
  {
    $Unterverzeichnisse = array();

if (is_dir ($Ausgangsverzeichnis))
    {
      $VerzeichnisZeiger = opendir ($Ausgangsverzeichnis);

while ($AktuellesElement = readdir ($VerzeichnisZeiger))
      {
        $NaechstesVerzeichnis = $Ausgangsverzeichnis . '/' . $AktuellesElement . '/';

if ((is_file ($NaechstesVerzeichnis) == true) | ($AktuellesElement == ".") | ($AktuellesElement == ".."))
          continue;

array_push ($Unterverzeichnisse, $NaechstesVerzeichnis);
        array_push ($Unterverzeichnisse, VerzeichnisEinlesen ($NaechstesVerzeichnis));
      }
    }
    return ($Unterverzeichnisse);
  }

function VerzeichnisseAusgeben ($VerzeichnisInhalt)
  {
    for ($a = 0; $a < count ($VerzeichnisInhalt); $a++)
    {
      $VerzeichnisInhalt [$a] = str_replace ("pic/pic/klein//", "", $VerzeichnisInhalt [$a]);
      $VerzeichnisInhalt [$a] = str_replace ("/", "", $VerzeichnisInhalt [$a]);

if (is_array ($VerzeichnisInhalt [$a]))
        VerzeichnisseAusgeben ($VerzeichnisInhalt [$a]);
      else
        echo $VerzeichnisInhalt [$a] . '<br>';
    }
  }

$VerzeichnisInhalt = VerzeichnisEinlesen ("pic/pic/klein/");
  VerzeichnisseAusgeben ($VerzeichnisInhalt);

?>

Nochmals vielen Dank im Voraus für Eure Bemühungen.

Gruss, Enrico

  1. hi,

    Prinzipiell geht es mir nun darum, die Pfadangabe anhand des Trennzeichens "_" zu splitten,

    explode(), oder strpos() in kombination mit substr().

    den vorderen Teil - sofern im ersten Select-Feld noch nicht vorhanden - dem ersten Select-Feld zuzuordnen und den Rest, als aufzuzeigender Inhalt, sobald die entsprechende Auswahl im ersten Select-Feld getroffen wurde, dem zweiten Select-Feld zuzuordnen.

    im "zweiten durchgang" ist der erste teil der zu "suchenden" zeichenketten ja bekannt.

    dann also nur noch den "rest" ermitteln.

    erst mal alle auswählen, die mit "ersterteil_" beginnen, und dort dann den teil hinter "ersterteil_" betrachten. dazu wieder strpos(), oder vielleicht besser noch gleich strstr() verwenden.

    und die "passenden" dann halt als options ins selectfeld schreiben ...

    tipp: nach der auswahl auf der erster seite dann wieder die einlese-prozedur auf dem dateisystem durchzuführen, wäre natürlich reichlich unperformant.
    deshalb vielleicht schon beim ersten einlesen alle strings in einer session zwischenspeichern ...

    gruß,
    wahsaga

    --
    I'll try being nicer if you'll try being smarter.
    1. Hallo wahsaga,

      Ich brauche nochmal dringend, dringend, dringend Deine tatkräftige Unterstützung...

      Momentan bin ich so weit:

      <?php

      function VerzeichnisEinlesen ($Ausgangsverzeichnis)
            {
              $Unterverzeichnisse = array();

      if (is_dir ($Ausgangsverzeichnis))
              {
                $VerzeichnisZeiger = opendir ($Ausgangsverzeichnis);

      while ($AktuellesElement = readdir ($VerzeichnisZeiger))
                {
                  $NaechstesVerzeichnis = $Ausgangsverzeichnis . '/' . $AktuellesElement . '/';

      if ((is_file ($NaechstesVerzeichnis) == true) | ($AktuellesElement == ".") | ($AktuellesElement == ".."))
                    continue;

      array_push ($Unterverzeichnisse, $NaechstesVerzeichnis);
                  array_push ($Unterverzeichnisse, VerzeichnisEinlesen ($NaechstesVerzeichnis));
                }
              }
              return ($Unterverzeichnisse);
            }

      function VerzeichnisseBearbeiten ($VerzeichnisInhalt)
            {
              $BearbeiteteVerzeichnisse = array ();

      for ($a = 0; $a < count ($VerzeichnisInhalt); $a++)
              {
                $VerzeichnisInhalt [$a] = str_replace ("pic/pic/klein//", "",   $VerzeichnisInhalt [$a]);
                $VerzeichnisInhalt [$a] = str_replace ("/",               "",   $VerzeichnisInhalt [$a]);
                $VerzeichnisInhalt [$a] = str_replace ("1",               " ",  $VerzeichnisInhalt [$a]);
                $VerzeichnisInhalt [$a] = str_replace ("2",               """, $VerzeichnisInhalt [$a]);
                $VerzeichnisInhalt [$a] = str_replace ("3",               "&",  $VerzeichnisInhalt [$a]);
                $VerzeichnisInhalt [$a] = str_replace ("4",               ",",  $VerzeichnisInhalt [$a]);
                $VerzeichnisInhalt [$a] = str_replace ("AE",              "ä",  $VerzeichnisInhalt [$a]);

      if (is_array ($VerzeichnisInhalt [$a]))
                  VerzeichnisseBearbeiten ($VerzeichnisInhalt [$a]);
                else
                  array_push ($BearbeiteteVerzeichnisse, $VerzeichnisInhalt [$a]);
              }
              return $BearbeiteteVerzeichnisse;
            }

      function SelectFelderErzeugen ($BearbeiteteVerzeichnisse)
            {
              $ArraySelectFelder   = array ();
              $SelectAuswahlRubrik = '<select name="GalerieAuswahlRubrik" size="1">';
              $SelectAuswahlOrdner = '<select name="GalerieAuswahlOrdner" size="1">';

      for ($a = 0; $a < count ($BearbeiteteVerzeichnisse); $a++)
              {
                if (strpos ($BearbeiteteVerzeichnisse [$a], "_"))
                {
                  $VerzeichnisZerlegt = explode ("_", $BearbeiteteVerzeichnisse [$a]);

      if (!strpos ($SelectAuswahlRubrik, $VerzeichnisZerlegt [0]))
                    $SelectAuswahlRubrik .= "<option value = " . $VerzeichnisZerlegt [0] . ">" . $VerzeichnisZerlegt [0] . "</option>";
                }
                else
                {
                  $SelectAuswahlRubrik .= "<option value = " . $BearbeiteteVerzeichnisse [$a] . ">" . $BearbeiteteVerzeichnisse [$a] . "</option>";
                }
              }
              $ArraySelectFelder [0] = $SelectAuswahlRubrik;
              $ArraySelectFelder [1] = $SelectAuswahlOrdner;

      return $ArraySelectFelder;
            }

      $VerzeichnisInhalt        = VerzeichnisEinlesen     ("pic/pic/klein/");
            $BearbeiteteVerzeichnisse = VerzeichnisseBearbeiten ($VerzeichnisInhalt);
            $ArraySelectFelder        = SelectFelderErzeugen    ($BearbeiteteVerzeichnisse);

      ?>

      Ich kann damit - wenn auch nur fast perfekt - das erste Select-Feld aufbauen.

      Nur:

      Wie bringe ich den Rest als Abhängigkeit des ersten Teiles in das zweite Select-Feld und v.a. wie verbinde ich die über PHP erzeugten Select-Felder mit dem Javascript-Code für das dynamische Füllen des zweiten Select-Feldes ?

      Vielen Dank wieder einmal :-)

      Gruss, Enrico