Thorsten Beuth: Automatische Sitemap

Hallo!

Ich bin grad dabei eine Seite aus Jucks und Dollerei(Langeweile) zu programmieren um mein Interesse(DSA) mal zu fröhnen. Dabei ist mir eine Idee gekommen, dass ich mir gerne eine Sitemap der Übersicht halber für die Seite machen sollte. Da die Seite aber jetzt schon extrem riesig ist, habe ich mir gesagt: Diese monotone Arbeit tust du dir nicht an! Also muss PHP dir helfen. Die Frage ist nun: Wie mach ich das?

Mein erstes Problem ist, dass ich nicht weiß wie die gesamte Verzeichnisstruktur eines angegebenen Pfades sinnvoll ausgelesen werden kann. Im Prinzip reicht es mir schon die Verzeichnisstruktur an sich auszulesen. Würde mich richtig freuen, wenn mir wer den Schritt abnehmen könnte, ich habe nämlich keine Ahnung von Verzeichnisauslesungen, die über eine Ebene hinausgehen.

Bedanke mich schonmal im Vorraus und hoffe auf baldige Hilfe. Jede Hilfe ist mir recht.

MfG
Thorsten

  1. Mein erstes Problem ist, dass ich nicht weiß wie die gesamte Verzeichnisstruktur eines angegebenen Pfades sinnvoll ausgelesen werden kann. Im Prinzip reicht es mir schon die Verzeichnisstruktur an sich auszulesen. Würde mich richtig freuen, wenn mir wer den Schritt abnehmen könnte, ich habe nämlich keine Ahnung von Verzeichnisauslesungen, die über eine Ebene hinausgehen.

    Das sollte dir schon weiter helfen: http://de3.php.net/manual/de/class.dir.php

    Gruß,
    Gerrit

  2. Lieber Thorsten,

    Mein erstes Problem ist, dass ich nicht weiß wie die gesamte Verzeichnisstruktur eines angegebenen Pfades sinnvoll ausgelesen werden kann. Im Prinzip reicht es mir schon die Verzeichnisstruktur an sich auszulesen.

    auf den Seiten von php.net habe ich in den User-Comments eine function gefunden, die ich mir modifiziert habe.

    Würde mich richtig freuen, wenn mir wer den Schritt abnehmen könnte, ich habe nämlich keine Ahnung von Verzeichnisauslesungen, die über eine Ebene hinausgehen.

    Wenn die User-Comments mir geholfen haben, warum sollte ich das dann nicht Dir weitergeben? Hier mein Code:

      
     // Funktion für Verzeichnisbaum (rekursiv)  
      
        function make_tree($path, $mode)  // $mode steuert, ob nur Verzeichnisse,  
           {                              // Dateien oder beides ausgelesen werden  
           $list = array();               //  soll. Werte: "dir", "file", "all"  
           $handle=opendir($path);  
           while($a=readdir($handle))  
              {  
              if(!preg_match('/^\./',$a))  
                 {  
                 $full_path="$path/$a";  
                 switch($mode)  
                    {  
                    case "all": $list[]=$full_path; break;  
                    case "dir": if(is_dir($full_path)) $list[]=$full_path; break;  
                    case "file": if(is_file($full_path)) $list[]=$full_path; break;  
                    }  
                 if(is_dir($full_path))  
                    {  
                    $recursive=make_tree($full_path, $mode);  
                    for($n=0; $n<count($recursive); $n++)  
                       {  
                       $list[]=$recursive[$n];  
                       }  
                    }  
                 }  
              }  
           closedir($handle);  
           return $list;  
           }  
    
    

    Das Ergebnis ist ein (unsortiertes) Array $list, in dem die Pfadangaben zu den Dateien/Verzeichnissen enthalten sind. Viel Erfolg mit dieser function!

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. Hallo Felix!

      Danke für den Quelltext! Er hilft mir wirklich sehr weiter. Leider läuft er nicht auf meinen Xampp Apache. Das macht aber nichts, ich werde ihn umschreiben. Was jedoch mich am meisten ärgert ist folgendes:

      $list[]=$full_path;

      Diese Zuweisung funktioniert einfach garnicht. Ich schau es mir mal an, wie man das umschreiben kann. Aber du hast mir sehr geholfen, danke danke!

      Grüße
      Thorsten

      1. Lieber Thorsten,

        $list[]=$full_path;

        Diese Zuweisung funktioniert einfach garnicht. Ich schau es mir mal an, wie man das umschreiben kann. Aber du hast mir sehr geholfen, danke danke!

        Wie sieht "funktioniert einfach garnicht" aus? Welche Fehlermeldung bekommst Du?

        $list ist ein Array. Du kannst mit array_pad() diese Zuweisung "umschreiben"... Aber ich sehe nicht ein, warum!

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

        1. Hallo Felix,

          vergiss was ich gesagt habe, läuft jetzt alles so wie es sollte. Mein Problem lag daran, dass ich nie irgendwelche Funktionen genutzt habe, aber jetzt funktionierts alles. Habe den Return anfangs nicht als globale Variabel abgespeichert und mich gewundert, warum $list leer ist, obwohl es in der Funktion ja funktioniert. Dann viel mir irgendwann ein, dass Funktionen ja globale Variabeln seperat deklinieren müssen, naja und dann habe ich das erstmal alles wieder gecheckt.

          MfG
          Tossek, ein Funktionen-Vermeider

          1. Lieber Thorsten,

            Habe den Return anfangs nicht als globale Variabel abgespeichert und mich gewundert, warum $list leer ist, obwohl es in der Funktion ja funktioniert.

            WAAAAS???? Globale Variablen??? Lass das sein! Wenn die Funktion per return einen Wert zurückliefert, dann nimm gefälligst diesen Wert! Alles andere wäre grober Unfug!

            Beispiel: $mein_dateibaum = make_tree("../", "all");

            Ab sofort hat in Deinem Script die Variablen $mein_dateibaum den Rückgabewert (Array!) der Funktion make_tree() gespeichert. Da ist nix mit globalen Variablen! Wozu auch!?

            Liebe Grüße aus Ellwangen,

            Felix Riesterer.

          2. Hi Thorsten,

            MfG
            Tossek, ein Funktionen-Vermeider

            Funktionen zu vermeiden ist so ziemlich das schlimmste was du machen kannst, da du nur mit Funktionen bzw. in PHP 5 mit Klassen und Methoden einen wiederverwertbaren Code erhälst und dir somit für die Zukuft Arbeit ersparen kannst.

            MfG, Dennis.

            --
            Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
            Crypt::PasswdMD5 jetzt auch in PHP
            Wer die FAQ gelesen hat, ist klüger! ... und weiß wie man Links macht ;-)