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

  • Gumfuzi
    hat ein Thema erstellt Array in rekursiver Funktion auslesen.

    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!

  • Gumfuzi
    antwortet
    OK, danke für die Erklärungen!

    Einen Kommentar schreiben:


  • HStev
    antwortet
    Wenn eine Variable als static deklariert wird behält diese zur kompletten Laufzeit des Script ihren letzten Wert bei als Beispiel:

    PHP-Code:
    <?php
    MyCount
    ();
    MyCount();
    MyCount();

    function 
    MyCount()
    {
       static 
    $count_static 0;
       
    $count_normal 0;
       echo 
    "
    Static: "
    .++$count_static;
       echo 
    "
    Normal: "
    .++$count_normal;
    }
    ?>

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Zitat von Gumfuzi
    Werde mich gleich mal einlesen, was es mit dem static-befehl so aufsich hat
    Das kannst Du Dir eigentlich sparen, aber schaden kann es ja nicht...

    Die Funktion war von mir so auf die Schnelle aus den vorigen zusammengeschustert.

    Ohne static sähe das dann in etwa so aus:
    PHP-Code:
    function show_all_files($path '.'$sub FALSE) {

      
    $files glob($path.'/*'GLOB_ONLYDIR);

      if (
    is_array($files)) {

        if (
    $sub) foreach ($files  as $file)
          if (
    is_array($subfiles show_all_files($fileTRUE)))
            
    $files array_merge($files$subfiles);

        return 
    $files;
      }

      return 
    FALSE;

    Einen Kommentar schreiben:


  • Gumfuzi
    antwortet
    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!

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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);
    ?>

    Einen Kommentar schreiben:


  • Gumfuzi
    antwortet
    Sorry, hatte Dein Edit überlesen...

    ja, genau so meinte ich das!

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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 => ...

    Einen Kommentar schreiben:


  • Gumfuzi
    antwortet
    Steh gerade am Schlauch - wo genau einfügen?

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Mit Unterordnern eindimensional?

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

    Einen Kommentar schreiben:


  • Gumfuzi
    antwortet
    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!

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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.

    Einen Kommentar schreiben:


  • Gumfuzi
    antwortet
    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?

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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); 

    Einen Kommentar schreiben:


  • Gumfuzi
    antwortet
    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?

    Einen Kommentar schreiben:

Lädt...
X