Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] durch rekursive Funktion ermittelte Werte in Array + ausgeben

Einklappen

Neue Werbung 2019

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

  • [Erledigt] durch rekursive Funktion ermittelte Werte in Array + ausgeben

    Hallo Leute...

    Ich versuche über folgenden Code ein Verzeichnis mitsamt seinen Unterverzeichnissen und Dateien auszulesen. Das Ergebnis der rekursiven Funktion soll im Array linksArray gespeichert werden. Anschliessend möchte ich dieses array ausgeben.

    Die einzelnen Dateien + Pfad erhalte ich auch als Ausgabe zurück. Wenn ich aber anschliessend die pfade zu den einzelnen Dateien im Array linksArray abspeichern und ausgeben möchte, erhalte ich keine Ausgabe für das Array (hier z.B. an der Pos. 1). Was mache ich falsch ???


    PHP-Code:
    <?php 
    $linksArray 
    = array(); 
    $valueArray 0;   

    function 
    get_dir ($dir$ebene) { 
      
    $fp=opendir($dir);
      while(
    $datei=readdir($fp)) { 
        if (
    is_dir("$dir/$datei") && $datei!="." && $datei!="..") { 

            if (
    $ebene<3get_dir("$dir/$datei",$ebene+1); 

        } 
        else {

             
    // Dateityp filtern
             
    if (strstr($datei"1.php"))  { 
               echo 
    $dir."/".$datei."<br>";
               
    $valueArray $dir."/".$datei;
              
    $linksArray[] = $valueArray;
              } 
        }
      }     
      
    closedir($fp);


    //Hauptprogramm
    get_dir ($_SERVER['DOCUMENT_ROOT']."verzeichnis/unterverzeichnis",1);
    echo 
    $linksArray[1]; 
    ?>


  • #2
    Bitte benutze in Zukunft die [PHP][/PHP]-Tags um Code zu posten.

    Zum Problem: Du musst dir das Array schon von der Funktion zurückgeben lassen.
    http://hallophp.de

    Kommentar


    • #3
      @Asipak

      entschuldige wegen der Tags.

      Array zurückgeben: Ich habe versucht die Zeile return $linksArray; nach closedir einzufügen, d.h. außerhalb der while-schleife. Hatte damit aber keinen Erfolg.

      Kannst du bitte genauer beschreiben wie du das meinst ?

      Kommentar


      • #4
        Das ist schon richtig: PHP: Rckgabewerte - Manual.

        Außerdem solltest du das PHP: error_reporting - Manual hochschrauben. Dein Array ist in der Funktion nicht definiert: PHP: Geltungsbereich von Variablen - Manual.

        Code:
        if ($ebene<3) get_dir("$dir/$datei",$ebene+1);
        Da fehlt eine Zuweisung oder eine Zusammenführung (je nachdem, was du vorhast) der Arrays mittels [MAN]array_merge[/MAN]. Ansonsten ginge der Rückgabewert der Funktion verloren.

        Gruß
        http://hallophp.de

        Kommentar


        • #5
          Für diesen Fall würde sich doch auf PHP: DirectoryIterator - Manual anbieten.
          Signatur:
          PHP-Code:
          $s '0048656c6c6f20576f726c64';
          while(
          $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

          Kommentar


          • #6
            Danke Asipak,

            das ist jetzt schon mal sehr aufschlussreich. Erhalte jetzt mehrfach folgende Fehlermeldung:
            Notice: Undefined variable: linksArray in .../prev_next.php on line 51
            und einmal diese:
            Notice: Undefined offset: 1 in .../prev_next.php on line 56

            ...und verstehe - glaube ich - den Grund: linksArray ist wohl ein lokal definiertes Array, müsste aber global definiert sein, wenn ich es sowohl innerhalb als auch außerhalb der Funktion ansprechen möchte. Soweit korrekt?

            Du sprichst von array_merge. Da liegt glaube ich aber noch ein Fehler meinerseits vor: Ich möchte gerne alle (ansonsten ausgegebenen) Werte der Funktion in EIN Array abspeichern. Da ich die 1. Fehlermeldung mehrfach bekomme scheint es mir aber, dass ich mehrere Arrays produziere, da ich diese in der while-schleife erzeuge. Richtig ? D.h. Ich müsste das Array ebenfalls außerhalb der Schleife erzeugen, oder ?

            Kommentar


            • #7
              Ich weiss es ist 23:30 Uhr...

              aber hat vielleicht trotzdem noch jemand ne Idee, wie ich die (ansonsten ausgegebenen) Werte der rekursiven Funktion (s. Code von mein 1. posting) in EIN Array abspeichern und ausgeben kann ?

              Danke für Eure Hilfe !

              Kommentar


              • #8
                PHP-Code:
                <?php
                function beispiel()
                {
                    
                $myarray = array('Honig''kuchen''pferd');
                    return 
                $myarray;
                }

                $newarray beispiel();
                echo 
                $newarray['0'],$newarray['1'],$newarray['2'];
                ?>
                Gute Nacht....

                Kommentar


                • #9
                  Fürs Dateisystem solltest Du Dir die SPL-Iteratoren ansehen.

                  Verzeichnisse (rekursiv) auslesen mit den Iteratoren der SPL - Codeschnipsel
                  CSV-Dateiliste eines Ordners erstellen - Codeschnipsel
                  --

                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                  --

                  Kommentar


                  • #10
                    @nikosch:

                    ah, gibt also noch ein paar andere nachteulen hier...werde deine tips checken. danke.

                    Kommentar


                    • #11
                      @ByStones:

                      ah ok. jetzt sehe ich auch was du mir zeigen wolltest. Wollte mich nur erst mal anhand von meinem Code durchhangeln.

                      Kommentar


                      • #12
                        Ach, LOL, steht ja schon oben, sorry..
                        --

                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                        --

                        Kommentar


                        • #13
                          @RustyXXL

                          halt halt Rusty warte noch mit dem ins Bett gehen... bitte

                          dein code ist plausibel, aber:

                          Innerhalb der Funktion definierst du für dein array die süßen Elemente 'Honig','kuchen','pferd'...
                          Die kann ich aber in meinem Fall so nicht definieren, weil ich nicht weiß welche Elemente (Dateien+Pfad) in mein Array kommen...meine Frage ist deshalb wie ich die Rückgabewerte meiner rekursiven Funktion überhaupt erst einmal in mein Array bekomme...Dein Vorschlag für die Ausgabe passt schon, danke.

                          Kommentar


                          • #14
                            @Asipak: so, ich hoffe es funktioniert jetzt mit den tags...
                            @alle:

                            So, ich glaube ich hab es dank Eurer Hilfe hinbekommen. Wenn ich die Position des auszugebenden Array-Elements bei newArray ändere spuckt er mir jedenfalls immer eine andere datei+pfad aus.
                            Bei rekursiven Funktionen ist ja immer Vorsicht geboten...ist die Lösung so korrekt ?

                            PHP-Code:
                            <?php 
                            error_reporting
                            (E_ALL);

                            $linksArray = array(); 
                            $valueArray 0;   

                            function 
                            get_dir ($dir$ebene) {
                              global 
                            $linksArray
                              
                            $fp=opendir($dir);
                              while(
                            $datei=readdir($fp)) { 
                                if (
                            is_dir("$dir/$datei") && $datei!="." && $datei!=".."
                                { 
                                 
                            // echo "$datei (dir)<br>"; 
                                 
                            if ($ebene<3get_dir("$dir/$datei",$ebene+1); 
                                } 
                                   else 
                                   {
                                       
                            // Dateityp filtern
                                         
                            if (strstr($datei"1.php"))  { 
                                       
                            //echo $dir."/".$datei."<br>";
                                    
                            global $valueArray;
                                       
                            $valueArray $dir."/".$datei;
                                       
                            $linksArray[] = $valueArray;
                                       } 
                                  }
                              }     
                              
                            closedir($fp);
                              return 
                            $linksArray;


                            //Hauptprogramm
                            $newArray get_dir ($_SERVER['DOCUMENT_ROOT']."/verzeichnis/unterverzeichnis",1);
                            echo 
                            $newArray[2]; 
                            ?>

                            Kommentar


                            • #15
                              global zu verwenden ist keine gute Idee. Du kannst das Array besser als Parameter an die Funktion übergeben. Und wie gesagt, an dieser Stelle verarbeitest du den Rückgabewert nicht weiter.
                              Code:
                              if ($ebene<3) get_dir("$dir/$datei",$ebene+1);
                              Diesen lässt du einfach in der Luft hängen.
                              http://hallophp.de

                              Kommentar

                              Lädt...
                              X