dey: is_dir (!is_dir) funktioniert nicht in 2. Ebene

Hallo,

ich versuche mehrere Verzeichnisse mit Unterverzeichnissen in Baumstruktur darzustellen.
Ich durchlaufe dabei den Aufruf opendir, readdir und is_dir so oft, wie meine Verzeichnisstruktur tief ist.
Eine Odrnungsgemässe Aufteilung zwischen Verzeichnissen und Dateien erhalte ich immer nur in dem Verzeichnis, in dem sich auch meine index.php befindet.
Warum?

  
$level_act=1;  
$dir_array = array (array('.'));  
$dir_act = "";  
//reset($dir);  
$file_array = array();  
while ( $level_act < 4){  
  
$dir_act = $dir_act.$dir_array[$level_act-1][0]."/";  
echo $dir_act."<br>";  
$dir[$level_act]=opendir ($dir_act);  
while (false !== ($dir_event = readdir ($dir[$level_act]))) {     //(false !== ($file = readdir($handle)  
    if (is_dir($dir_event )&& ($dir_event != ".") && ($dir_event != "..")){  
         if (!isset($dir_array[$level_act]))  {$dir_array[$level_act]=array($level_act=>$dir_event);}  
         else  {$dir_array[$level_act]= array_merge ($dir_array[$level_act],$dir_event);}  
    }  
    elseif (!is_dir($dir_event)){  
         if (!isset($file_array[$level_act]))  {$file_array[$level_act]=array($level_act=>$dir_event);}  
         else  {$file_array[$level_act]= array_merge ($file_array[$level_act],$dir_event);}  
    }  
}  
$level_act=$level_act+1 ;  
}  
echo "<pre>";print_r ($dir_array);echo"</pre>";  
echo "<pre>";print_r ($file_array);echo"</pre>";  

Ausgabe:
Array
(
    [0] => Array
        (
            [0] => .
        )

[1] => Array
        (
            [0] => 1-ho-test
            [1] => easypig
            [2] => ho-test-org
            [3] => photoit
            [4] => xml
        )

)

Array
(
    [1] => Array
        (
            [0] => 2003-005e.pdf
            [1] => edit-multi-array.php
            [2] => file-upload.php
            [3] => gaestebuch.php
            [4] => glob-test.php
            [5] => index.php
            [6] => inhalt.php
            [7] => inhalt.xml
            [8] => lih2.html
            [9] => parse-xml.php
            [10] => pdf-in-iframe.php
            [11] => phpinfo.php
        )

[2] => Array
        (
            [0] => galerie
            [1] => galerie.php
            [2] => grafik.php
            [3] => index.php
        )

[3] => Array
        (
            [0] => galerie
            [1] => galerie.php
            [2] => grafik.php
            [3] => index.php
        )

)

Eigentlich müsste das erste array am Ende so
    [1] => Array
        (
            [0] => 1-ho-test
            [1] => easypig
            [2] => ho-test-org
            [3] => photoit
            [4] => xml
        )
    [2] => Array
        (
            [0] => galerie
        )
)
aussehen.
Ich habe schon x Varianten mit unterschiedlichen root und auch sonstiges probiert. Ich begreife es nicht?!

bydey

--
-- noch immer ein erfolgloser <DIV> Jünger --
  1. hi,

    Ich durchlaufe dabei den Aufruf opendir, readdir und is_dir so oft, wie meine Verzeichnisstruktur tief ist.
    Eine Odrnungsgemässe Aufteilung zwischen Verzeichnissen und Dateien erhalte ich immer nur in dem Verzeichnis, in dem sich auch meine index.php befindet.
    Warum?

    Wenn is_dir dir nicht das erwartete Ergebnis liefert - dann liegt das oftmals daran, dass der Verzeichnis-/Dateiname, den du der Funktion übergeben hast, gar nicht gefunden werden konnte. Und was nicht ist, ist auch kein Dir.

    Überprüfe also zunächst, ob du den Pfad auch richtig angegeben hast - mache eine Kontrollausgabe.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo,

      Überprüfe also zunächst, ob du den Pfad auch richtig angegeben hast - mache eine Kontrollausgabe.

      die Kontrollausgabe ist im 2. array:

      • dort wird mit !is_dir gefiltert
      • was allerdinfs auch nicht funktioniert, weil meine Verzeichnisse hier landen = der komplette Verzeichnisinhalt

      Was ich nicht verstehe, selbst wenn ich ein Unterverzeichnis zu Ebene 1 mache (root $dir_array = array (array('.')); wird zu $dir_array = array (array('./easypig'));) werden Verzeichnisse und Dateien auch nicht gemäss meiner Filter in array 1 und 2 verteilt.
      Es scheint immer nur für die Verzeichnisebene zu funktionieren, in der sich die index.php mit dem script befindet.
      ich habe die index.php auch schon in 1-ho-test gelegt. Wenn die dann aufrufe wird der Inhalt des Verzeichnisses wiederum korrekt auf die arrays verteilt.

      Noch irgendeine Idee?

      bydey

      --
      -- noch immer ein erfolgloser <DIV> Jünger --
  2. Moin!

    Warum?

      
    
    > $dir_array = array (array('.'));  
    
    

    Eine ordnungsgemäße Ausführung des Codes ergibt sich oftmals nur durch Anwendung von absoluten Pfadangaben. Zumindest wächst mit denen dann das Verständnis dafür, an welchen Stellen gesucht wird.

    Ergänze bzw. ersetze also deinen "." mal durch den Inhalt von $_SERVER['DOCUMENT_ROOT'] plus Unterverzeichnis, in dem du dich befindest.

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Hallo,

      Ergänze bzw. ersetze also deinen "." mal durch den Inhalt von $_SERVER['DOCUMENT_ROOT'] plus Unterverzeichnis, in dem du dich befindest.

      Notice: Undefined index: DOCUMENT_ROOT in D:\Eigene\html\phptest\index.php on line 20?
      Das ist nicht das erste mal, das ich mit $_SERVER.... Probleme habe.
      Einstellungsprobleme? (wobei meine Einstellung meist sehr positiv ist.

      bydey

      --
      -- noch immer ein erfolgloser <DIV> Jünger --
      1. hi,

        Notice: Undefined index: DOCUMENT_ROOT in D:\Eigene\html\phptest\index.php on line 20?
        Das ist nicht das erste mal, das ich mit $_SERVER.... Probleme habe.
        Einstellungsprobleme?

        Ja, defintiv.

        Hast du ein lokales Testsystem?
        Dann passe das Document Root in der Konfiguration deines Webservers an (httpd.conf beim Apachen). Achtung: Ggf. nur beim Virtual Host, unter dem du testest.

        Falls das Problem bei deinem Provider auftritt, bitte ihn die Konfiguration zur vervollständigen.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Hallo,

          Hast du ein lokales Testsystem?

          logo
          IIS

          Dann passe das Document Root in der Konfiguration deines Webservers an (httpd.conf beim Apachen). Achtung: Ggf. nur beim Virtual Host, unter dem du testest.

          IIS ist auf C:
          Meine HTML-Projekte sind zur Datensicherheit auf D: (ich lege doch nix auf M$ OS Partition ab ;oP)

          Habe das Basisverzeichnis mal auf d:\eigene\html gesetzt:
          Fehlermeldung iimmer noch gleich:
          Notice: Undefined index: DOCUMENT_ROOT in D:\Eigene\html\phptest\index.php on line 20

          bydey

          --
          -- noch immer ein erfolgloser <DIV> Jünger --
      2. Moin!

        Ergänze bzw. ersetze also deinen "." mal durch den Inhalt von $_SERVER['DOCUMENT_ROOT'] plus Unterverzeichnis, in dem du dich befindest.

        Notice: Undefined index: DOCUMENT_ROOT in D:\Eigene\html\phptest\index.php on line 20?
        Das ist nicht das erste mal, das ich mit $_SERVER.... Probleme habe.
        Einstellungsprobleme? (wobei meine Einstellung meist sehr positiv ist.

        Was sagt print_r($_SERVER)? Und print_r($ENV)?

        - Sven Rautenberg

        --
        My sssignature, my preciousssss!
        1. Hallo,

          Was sagt print_r($_SERVER)?

          Wonach soll ich hier schauen? Will dieses lange array nicht posten.

          Und print_r($ENV)?

          Fehler:
          Notice:  Undefined variable:  ENV in D:\Eigene\html\phptest\index.php on line 72
          selbst behoben: print_r($_ENV)
          Wonach soll ich hier schauen? Will dieses lange array nicht posten.

          bydey

          --
          -- noch immer ein erfolgloser <DIV> Jünger --
          1. Hallo,

            Was sagt print_r($_SERVER)?
            Wonach soll ich hier schauen? Will dieses lange array nicht posten.

            Und print_r($ENV)?
            Fehler:
            Notice:  Undefined variable:  ENV in D:\Eigene\html\phptest\index.php on line 72
            selbst behoben: print_r($_ENV)
            Wonach soll ich hier schauen? Will dieses lange array nicht posten.

            OK, die beiden Fragen entbehren einer durchschnitllichen Intelligenz, die man hier schon erwarten darf!
            Habe mir das ganze mal angeschaut und der Schlüssel DOCUMENT_ROOT fehlt!
            Was ist zu tun bei IIS?

            bydey

            --
            -- noch immer ein erfolgloser <DIV> Jünger --
            1. hi,

              Habe mir das ganze mal angeschaut und der Schlüssel DOCUMENT_ROOT fehlt!
              Was ist zu tun bei IIS?

              Der IIS scheint wirklich kein DOCUMENT_ROOT zu kennen.

              Aber in den Userkommentaren im PHP-Manual finden sich Workarounds, bspw.:

              How to get $_SERVER["DOCUMENT_ROOT"] on IIS :

              if(!isset($_SERVER["DOCUMENT_ROOT"]))
              {$_SERVER["DOCUMENT_ROOT"]=substr($_SERVER['SCRIPT_FILENAME'] , 0 , -strlen($_SERVER['PHP_SELF'])+1 );
              }

              it simply works!

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
              1. Hallo,

                it simply works!

                NOT!
                Ergebnis:
                D:\Eigene\html\p
                Sollte aber wohl so aussehen:
                D:\Eigene\html\

                Macht aber nix, da
                a) mein eigentliches Problem gelöst und
                b) ich vermutlich in der Lage bin, es so zu modifizieren, dass es funktioniert

                bydey

                --
                -- noch immer ein erfolgloser <DIV> Jünger --
                1. echo $begrüßung;

                  D:\Eigene\html\

                  Du scheinst Magic Quotes eingeschaltet zu haben, die aber hier kontraproduktiv und ansonsten auch nur bedingt hilfreich sind. Versuche sie auszuschalten oder Gegenmaßnahmen zu treffen und verwende die für das jeweilige Ausgabemedium bestimmte und besser geeignete Maskierungsfunktionen (mysql_real_escape_string() für MySQL, htmlspecialchars() für HTML, usw.).

                  Zum Thema $_SERVER[...]: $_SERVER is an array containing information such as headers, paths, and script locations. The entries in this array are created by the webserver. There is no guarantee that every webserver will provide any of these; servers may omit some, ...

                  echo "$verabschiedung $name";

            2. Moin!

              Was ist zu tun bei IIS?

              Wer benutzt denn den IIS, wenn er nicht muß?

              Der ist in meinen Augen extrem schlecht grundsätzlich konfigurierbar (gibt kein .htaccess, alle Accounts für HTTP-Authentifizierung müssen Systemaccounts sein etc...). Ich würde den meiden, wenn es geht.

              - Sven Rautenberg

              --
              My sssignature, my preciousssss!
  3. Hallo,

    $dir_array = array (array('.'));

    /*  ... */

    
    >   
    > Ausgabe:  
    > Array  
    > (  
    >     [0] => Array  
    >         (  
    >             [0] => .  
    >         )  
    >   
    >     [1] => Array  
    >         (  
    >             [0] => 1-ho-test  
    >             [1] => easypig  
    >             [2] => ho-test-org  
    >             [3] => photoit  
    >             [4] => xml  
    >         )  
    >   
    > )  
    > Eigentlich müsste das erste array am Ende so  
    >     [1] => Array  
    >         (  
    >             [0] => 1-ho-test  
    >             [1] => easypig  
    >             [2] => ho-test-org  
    >             [3] => photoit  
    >             [4] => xml  
    >         )  
    >     [2] => Array  
    >         (  
    >             [0] => galerie  
    >         )  
    > )  
      
    Es ist von Dir so definiert worden, also wird es auch so ausgegeben. Eine Ersetzung finde ich in dem ein Haufen unübersichtlichem dir-array-Wörtersalat Alias "Quellcode" nicht.  
      
      
    Gruß aus Berlin!  
    eddi  
    
    -- 
    Wer Rechtschreibfehler findet, darf sie behalten.
    
    1. Die Funktion sollte alles tun, was Du willst (alles außer notice-frei zu sein ;)

        
      function directory($pfad='.'){  
       $a=array();  
       $pfad.=substr($pfad,0,-1)=='/' ? '' : '/';  
       $dir=opendir($pfad);  
       while(($f=readdir($dir))!==FALSE)  
        if($f!='.' && $f!='..')  
         $a[filetype($pfad.$f)][]=(filetype($pfad.$f)=='dir') ? directory($pfad.$f) : $pfad.$f;  
       closedir($dir);  
       return($a);  
      }  
      
      

      Gruß aus Berlin!
      eddi

      --
      Wer Rechtschreibfehler findet, darf sie behalten.
      1. Moin!

        Die Funktion sollte alles tun, was Du willst (alles außer notice-frei zu sein ;)

        Die Funktion ist rekursiv und liefert ein rekursives Array zurück. Das ist nicht zwingend das, was dey will. Seine Datenstruktur ist nämlich anders, und könnte auch deshalb anders sein, weil er sie seiner sonstigen Anforderung angepaßt hat.

        - Sven Rautenberg

        --
        My sssignature, my preciousssss!
      2. Hallo eddi,

        Die Funktion sollte alles tun, was Du willst (alles außer notice-frei zu sein ;)

        es wird in jedem Falle helfen, meine Funktion zu überprüfen.
        Für mich ist allerdings die Überprüfung, ob es sich um ein Verzeichnis oder eine Datei handelt wichtig!
        Ich werde mal schauen, ob ich !== false...readdir dazu vergewaltigen kann.

        bydey

        --
        -- noch immer ein erfolgloser <DIV> Jünger --
  4. Hallo,

    Problem ist so weit im Griff:

    • filetype funktioniert besser als is_dir
    • warum auch immer

    bur noch die Frage, warum $_SERVER... bei mir nicht geht

    bydey

    --
    -- noch immer ein erfolgloser <DIV> Jünger --