Server hängt sich bei Rekursion auf :/

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Server hängt sich bei Rekursion auf :/

    Hi,
    wollte nur mal eben kleines Script schreiben, allerdings
    beim Wiederaufruf meiner Funktion, bzw. bei der
    Rekursion verabschiedet sich der Server (siehe die
    Funktion "getFiles()", hier der Code:

    PHP-Code:
    <?php
        
    function getFiles($myDir="",$myFileSuffix=array("*"),$myDirDepth=0)
        {   
            
    $dir=$myDir;
            
    $files=glob("$dir{".implode(","$myFileSuffix)."}"GLOB_BRACE);
            
            foreach (
    $files as $file)
            {
                if(!
    is_dir($file))
                echo 
    $file."<br />";
                else
                
    getFiles($file,$myFileSuffix,$myDirDepth);
            }  
        }
        
        
    getFiles("dir0/",array("*"));
    ?>
    Hab ich da irgendwas übersehen?

    Gruß darki

  • #2
    du hast dir $files nicht ausgeben lassen.

    Kommentar


    • #3
      Habs gerade rausgefunden, ich hab ein "/" vergessen.
      sollte bei der Rekursion so heißen:
      getFiles($file."/",$myFileSuffix,$myDirDepth);

      Trotzdem danke fürs Durchlesen, Viele Grüße darki
      Zuletzt geändert von darki777; 09.06.2007, 14:15.

      Kommentar


      • #4
        Habe allerdings nun ein weiteres Problem,
        ich möchte unter anderem auch angeben können
        wie tief er suchen soll, bzw. die Verzeichnisstiefe.
        Allerdings krieg ich bei Übergabe einer temporären
        Variable an die rekursive Funktion, um diese für
        die Tiefenberechnung zu verwenden, totalen Schrott
        zusammen, wie müsste ich am Besten vorgehen?

        Meine momentane Funktion:
        PHP-Code:
        <?php
            
        function getFiles($myDir="",$myFileSuffix=array("*"),$myDirDepth=0)
            {   
                
        // Reguläre Variablen:
                
        $dir=$myDir;
                
        $suffix=$myFileSuffix;
                
        $files=glob($dir."*");
                
        $depth=$myDirDepth;
                
        $suffix_container=array();
                
                
        // Verzeichnisse/Dateien auslesen:
                
        foreach ($files as $counter1 => $file)
                {
                    
        $basename=basename($file);
                    
        $thisSuffix=substr($basename,strlen($basename)-3);
                    
                    foreach (
        $suffix as $counter2 => $value)
                    {                                          
                        if(!
        is_dir($file) && ($thisSuffix == $value || $suffix[0] == "*"))
                        {
                            echo 
        "<br />".$file." :: ".$counter2."<br />";
                        }
                        else if(
        $tmp_depth<$depth)
                        {
                            
        getFiles($file."/",$myFileSuffix,$myDirDepth);
                        }
                    }
                }
            }
            
            
        // Funktion aufrufen:
            
        getFiles("dir0/",array("txt"),2);
        ?>
        Im groß und ganzen weis ich nicht wie ich genau ansetzen
        soll um die Tiefe jedes jeweiligen Verzeichnisses/Datei
        zu erhalten/abzuspeichern.

        Gruß darki

        Kommentar


        • #5
          du musst die tiefe bei jedem aufruf runterzählen und dann einfach nur vergleichen, ob größer 1.
          in etwa so:
          PHP-Code:
          function test_rec($depth)
           {
            echo 
          'Aufruf mit depth: '.$depth.'</br>';
            if(
          $depth>1)
             
          test_rec(--$depth);
           } 
          [EDIT] achso, die aktuelle tiefe möchtest du auch haben - kannst du dann so machen:
          PHP-Code:
          function test_rec($max_depth$current_depth=0)
           {
            echo 
          'current depth: '.$current_depth.'</br>';
            if(
          $max_depth>$current_depth)
             
          test_rec($max_depth, ++$current_depth);
           } 
          Zuletzt geändert von 3DMax; 09.06.2007, 18:25.

          Kommentar


          • #6
            Das hab ich anfangs auch gedacht,
            allerdings fehlt da doch etwas oder nicht?
            z.B. man hat die Verzeichnissstruktur:

            dir0
            dir0/dir1
            dir0/dir2
            dir0/dir2/dir4
            dir0/dir3

            Beim Auslesen von dir0 springt er dann
            mal zu dir0/dir2/dir4, erhöht
            und springt dann nach dir0/dir3 und hat auf
            einmal die falsche Tiefe drin, da er vorher
            in einer anderen Tiefe war, nämlich die
            von dir0/dir2/dir4, was soll man da tun?

            Gruß darki
            Zuletzt geändert von darki777; 10.06.2007, 13:03.

            Kommentar


            • #7
              eigentlich nicht. Du sollst ja nicht pauschal um 1 erhöhen.

              wenn du auf höhe dir0 die tiefe 3 hast, dann sollte das auch bei jedem dir0 so sein.

              Kommentar


              • #8
                achso, du hast ja noch eine innere foreach-schleife.
                dann müsstest du die tiefe nur für den rekursiven aufruf erhöhen. also rec($depth+1) anstelle von rec(++$depth)
                oder du legst vor der schleife eine hilfsvariable an. $new_depth=$depth+1;

                Kommentar


                • #9
                  Thx euch beiden, werd ich morgen mal ausprobieren.

                  [EDIT:] Funktioniert süüüper danke, hatte viel zu
                  viel schnickschnack reingebaut und ausprobiert,
                  zu umständlich mal wieder ^^.

                  Vieleicht braucht es ja mal jemand, hier der Code:
                  PHP-Code:
                  <?php
                      
                  function getFiles($myDir="",$myFileSuffix=array("*"),$myDirDepth=0,$tmp_depth=0)
                      {   
                          
                  // Reguläre Variablen:
                          
                  $dir=$myDir;
                          
                  $suffix=$myFileSuffix;
                          
                  $files=glob($dir."*");
                          
                  $depth=$myDirDepth;
                          
                          
                  // Verzeichnisse/Dateien auslesen:
                          
                  foreach ($files as $counter1 => $file)
                          {
                              
                  $basename=basename($file);
                              
                  $thisSuffix=substr($basename,strlen($basename)-3);
                              
                              foreach (
                  $suffix as $counter2 => $value)
                              {                                           
                                  if(!
                  is_dir($file) && ($thisSuffix == $value || $suffix[0] == "*"))
                                  {
                                      echo 
                  $file." :: ".""."<br />";
                                  }
                                  else if(
                  $tmp_depth<$depth)
                                  {
                                      
                  getFiles($file."/",$myFileSuffix,$myDirDepth,$tmp_depth+1);
                                  }
                              }
                          }
                      }
                      
                      
                  // Funktion aufrufen (jpg's und txt Dateien suchen, max. Suchtiefe 1):
                      
                  getFiles("dir0/",array("txt","jpg"),1);
                      
                  // Oder getFiles("dir0/"); alle Dateien suchen und unendliche Suchtiefe
                  ?>
                  Gute Nacht, darki
                  Zuletzt geändert von darki777; 10.06.2007, 23:52.

                  Kommentar

                  Lädt...
                  X