Ankündigung

Einklappen
Keine Ankündigung bisher.

Array in rekursiver Funktion auslesen

Einklappen

Neue Werbung 2019

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

  • Array in rekursiver Funktion auslesen

    Hallo!

    Ich habe eine rekursive Funktion, welche alle Sub-Ordner eines Ordners ausliest und in einen Array ($folder) speichert.
    Jedoch wird der Array immer wieder gelöscht (?), sobald sich die Funktion selbst aufruft.
    PHP-Code:
    function show_all_files($ordner$links 0$sub FALSE)
    {
      
    $handle opendir($ordner);
      while (
    $file readdir ($handle)) {
        if(
    $file != "." && $file != "..") {
          if(
    is_dir($ordner."/".$file)) {
              
    $c++;
            
    $folder[$c] = $ordner.'/'.$file;
            
    $folder[$c] = str_replace(".//"""$folder[$c]);
            
    show_all_files($ordner."/".$fileTRUE);
          }
        }
      }
      
    closedir($handle);
      return 
    $folder;

    Wie mache die den Array "$folder" auch außerhalb der Funktion verfügbar?
    (ich will einfach die einzelnen Werte in einem Array haben)
    Gibt es da einen Weg?
    Falls es nur bei normalen Variablen (Strings) geht, dann könnte man ja die Daten mit einem Trennkennzeichen aneinanderfügen und ausserhalb der Funktion wieder mit "strtok" zerteilen, oder?

    Wer kann mir da helfen bzw. einen Tipp geben? Wäre sehr dankbar!

  • #2
    Ein einfacher Tipp ohne tief in deine spezielle Rekursion einzusteigen wäre:

    Die Funktion kann einen Rückgabewert haben!
    Auch rekursiv.
    Kann man irgendwie zusammenschmeißen.
    Habs bis dato nur als String in virtuellen Filesystemen gebraucht.
    Code, wenn die entsprechenden Funktionen implementiert sind:
    PHP-Code:
    <?php
    function getPath($folder) {
        if(
    $folder->isRoot()) {
            return 
    '/';
        } else {
            return 
    Folder::getPath($folder->getParent()).$folder->name.'/';
        }
    }
    ?>
    Raus kommt dann zB so ein String '/home/desian/downloads/'
    Mit ein wenig Creativität lässt sich auch irgendwir ein Array daraus schmieden. Wie gesagt, ich habs bis dato nur noch nie gebraucht.

    Gruß
    Der Desian
    Wenn dich was ankotzt, machs besser.

    Kommentar


    • #3
      Re: Array in rekursiver Funktion auslesen

      Zitat von Gumfuzi
      Jedoch wird der Array immer wieder gelöscht (?), sobald sich die Funktion selbst aufruft.
      Das kann eigentlich nicht sein. Vor allem wird das Ergebnis der Funktion ja in den leeren Raum geschickt.

      Zitat von Gumfuzi
      Wie mache die den Array "$folder" auch außerhalb der Funktion verfügbar?
      Entweder den Rückgabewert der Funktion einer Variablen zuweisen (<?php $folder = show_all_files(); ?>) oder in der Funktion mit einer globalen Variable arbeiten, was in Deinem Fall aber wenig Sinn macht (<?php global $folder; ?>).


      Vielleicht?
      PHP-Code:
      <?php
      glob
      ($ordner.'/*'GLOB_ONLYDIR);
      ?>

      Kommentar


      • #4
        Re: Array in rekursiver Funktion auslesen

        Zitat von Gumfuzi
        PHP-Code:
        function show_all_files($ordner$links 0$sub FALSE)
        {
          
        //..
                
        show_all_files($ordner."/".$fileTRUE); // wieso speicherst du den Return-Wert nicht?
          // ..
          
        return $folder// musst ihn dir schon merken ^^

        Kommentar


        • #5
          Ich sammle mal ein paar Gedanken:

          Das
          PHP-Code:
          <?php
          $folder 
          show_all_files()
          ?>
          speichert im $folder den rückgabewert (was ich aber nur durch "return $folder" zurückbekomme). Ist es dann auch ausserhalb der Funktion verfügbar? (auch rekursiv?).
          Die $folder wird aber dann auch jedesmal überschieben, oder? Da wäre es am besten, die $folder danach gleich in eine nicht von der Funktion verwendeten Variable zu speichern, bevor die Funktion wieder aufgerufen wird (rekursiv), zB. "$output[$c]"?
          Aber dann wäre die "$output[$c]" nach Ende der Funktion wieder leer bzw. nicht aufrufbar, d.h. ich muss ein "global" devorsetzten - muss ich das nur einmal davorsetzten oder jedesmal, wenn ich den Array anspreche?

          Kommentar


          • #6
            Hier mal ein kurzes Beispiel, vielleicht hilft es:
            PHP-Code:
            function show_all_files($path '.'$sub FALSE) {
              
            $files glob($path.'/*');
              if (
            is_array($files)) {
                
            $dc 0;
                foreach (
            $files  as $file)
                  if (
            is_dir($file)) {
                    
            $folder['dirs']['name'][$dc++] = basename($file);
                    if (
            $sub)
                      
            $folder['dirs']['subs'][$dc-1] = show_all_files($fileTRUE);
                  }
                  else {
                    
            $folder['files'][] = basename($file);
                  }
                return 
            $folder;
              }
              return 
            FALSE;
            }

            $folder show_all_files('.',TRUE);
            print_r($folder); 

            Kommentar


            • #7
              Super, danke!
              Die Variablen werden übergeben, allerdings bräuchte ich die als eindimensionalen Array, d.h. mit $folder[1], $folder[2], etc. der Reihe nach.

              die "files" im else-Bereich habe ich mal ausgeklammert, da ich nur die Ordner brauche, aber in Form des ganzen Pfades relativ zum Ausgangsordner. Die sollen dann nämlich der Reihe nach in einer anderen Funktion bearbeitet werden.

              Wie kann ich das machen?

              Kommentar


              • #8
                Vielleicht so ähnlich?
                PHP-Code:
                <?php
                function show_all_files($path '.'$sub FALSE) {
                  
                $files glob($path.'/*'GLOB_ONLYDIR);
                  if (
                is_array($files)) {
                    foreach (
                $files  as $file) {
                      
                $folder['dirs'][] = $file;
                      if (
                $sub)
                        
                $folder['subdirs'][$file] = show_all_files($fileTRUE);
                    }
                    return 
                $folder;
                  }
                  return 
                FALSE;
                }

                $folder show_all_files('..',TRUE);
                print_r($folder);
                ?>
                /edit:
                Glaub doch nicht!?

                Was meinst du genau mit:
                Zitat von Gumfuzi
                allerdings bräuchte ich die als eindimensionalen Array, d.h. mit $folder[1], $folder[2], etc. der Reihe nach.

                Kommentar


                • #9
                  Ist schon besser, aber dennoch mehrdimensional, ich würde gerne die einzelnen Ordner als Array $folder[$c] abrufen können (mit einer Schleife, die das $c immer um eins erhöht, wobei die Schleife nicht das Prob ist )

                  Danke für Deine Mühen!

                  Kommentar


                  • #10
                    Mit Unterordnern eindimensional?

                    Oben noch folgendes einfügen:
                    PHP-Code:
                    $folder = array(); 

                    Kommentar


                    • #11
                      Steh gerade am Schlauch - wo genau einfügen?

                      Kommentar


                      • #12
                        Nur ein 'Schönheitsfehler':
                        PHP-Code:
                        <?php
                          
                        ...
                          if (
                        is_array($files)) {
                            
                        $folder = array();
                            foreach (
                        $files  as $file) {
                            ...
                        ?>

                        Beantworte mir lieber die Frage, wie Du Unterordner mit einem eindimensionalen Array ausgeben möchtest?

                        Z.B. so?
                        Code:
                        0 => ordner
                        1 => ordner/unterordner
                        2 => ordner/unterordner/unterordner2
                        3 => ordner2
                        4 => ordner2/unterordner
                        5 => ...

                        Kommentar


                        • #13
                          Sorry, hatte Dein Edit überlesen...

                          ja, genau so meinte ich das!

                          Kommentar


                          • #14
                            PHP-Code:
                            <?php
                            function show_all_files($path '.'$sub FALSE) {
                              static 
                            $folder;
                              
                            $files glob($path.'/*'GLOB_ONLYDIR);
                              if (
                            is_array($files)) {
                                foreach (
                            $files  as $file) {
                                  
                            $folder[] = $file;
                                  if (
                            $sub)
                                    
                            show_all_files($fileTRUE);
                                }
                                return 
                            $folder;
                              }
                              return 
                            FALSE;
                            }

                            $folder show_all_files('..',TRUE);
                            print_r($folder);
                            ?>

                            Kommentar


                            • #15
                              Perfekt, danke!!

                              Werde mich gleich mal einlesen, was es mit dem static-befehl so aufsich hat, damit ich den beim nächsten Mal auch einsetzten bzw. verwenden kann. Ebenso das mysteriöse "GLOB_ONLYDIR".

                              Danke nochmals!

                              Kommentar

                              Lädt...
                              X