Avatar billede lopolla123 Nybegynder
25. maj 2005 - 19:01 Der er 8 kommentarer og
1 løsning

Rekursiv funktion

Jeg har stillet spørgsmål før om rekursivitet, og jeg har en grum fornemmelse af, at jeg bare lige skal have banket det ind med 7-tommersøm :-)

Problem:
Jeg vil gerne have alle foldere tilbage med komplet sti/path fx i array: $DirComplete

En rekursiv-kender kan sikkert se problemet......så jeg ser frem til at høre fra kederne ;)


----------
Funktion
----------
function showDir($dir)
{
    if($checkDir = opendir($dir))
    {
        while($file = readdir($checkDir))
        {
            $PathToEvent = "$dir/$file";

            // Dir
            if(is_dir($PathToEvent))
            {
                if(($file != ".") && ($file != ".."))
                {
                    $DirComplete[] = "$PathToEvent";

                    showDir($PathToEvent);

                    echo "Dir -> $PathToEvent";
                    echo "\n";
                }
            }
        }
    }
}
----------
Avatar billede erikjacobsen Ekspert
25. maj 2005 - 19:59 #1
Du skal nok bare tilføje en
    global $DirComplete;
til funktionen.
Avatar billede lopolla123 Nybegynder
25. maj 2005 - 20:13 #2
Det er rigtigt, men jeg synes det er lidt et "hack", særligt fordi jeg meget gerne senere hen vil have den ind i en klasse, og så er det altså noget bøvl. Jeg ville jo gerne have en god gammeldags returnværdi, dvs. slutteligt i funktionen en return($FileComplete);
Avatar billede erikjacobsen Ekspert
25. maj 2005 - 21:59 #3
Det var også mere for at sige hvad der var galt. Man skal ikke bruge rekursion, efter min mening. Du kan gøre det på denne måde: (funktionen returnerer dit array)

function showDir($dir) {
  $DirComplete=array();
  $dirs=array($dir);
  while ($dir=array_pop($dirs)) {
    if($checkDir = opendir($dir)) {
      while($file = readdir($checkDir)) {
        $PathToEvent = "$dir/$file";
        if(is_dir($PathToEvent)) {
          if(($file != ".") && ($file != "..")) {
            array_push($dirs,$PathToEvent);
          }
        } else {
          $DirComplete[]=$PathToEvent;
        }
      }
    }
  }
  return $DirComplete;
}
Avatar billede lopolla123 Nybegynder
25. maj 2005 - 23:50 #4
Ja - det virker ganske vel, men hvorfor ikke bruge rekursion i dette tilfælde?
Er det da meget "dyrere" end din metode?
Avatar billede nielle Nybegynder
26. maj 2005 - 06:28 #5
Uden rekursion kommer man da ikke "i bund" i bibliotekstrukturen?!
Avatar billede erikjacobsen Ekspert
26. maj 2005 - 09:11 #6
Jo, man kommer til bunds, se på $dirs variablen.
Det er nok dyrere med rekursion, da du holder flere kataloger åbne på een gang.
Rækkefølgen af resultatet, hvis det er filnavne man vil have, er også mere logisk, syn's jeg.

(Jeg kan se nu at du kun skal have katalognavne, og jeg har skrevet det så du kun får filnavne - men den fikser du sikkert selv ....)
Avatar billede kargo1 Nybegynder
26. maj 2005 - 20:59 #7
Det, du mangler at gøre, er at returnere resultatet af hvert kald til det foregående kald. Når du ikke gør $DirComplete til en global variabel som foreslået af Erik Jacobsen, bliver den til en ny, tom variabel ved hvert kald, og den slettes igen, hver gang funktionen afsluttes. Med mit forslag herunder får du et array i flere dimensioner svarende til biblioteksstrukturen. Vil du have et array i een dimension, kan du medsende det som en variabel - men det er nok "dyrt".

function showDir($dir)
{
    // ** Ny kode
    $DirComplete = array(); // Et array skal vist erklæres?
    // ** Slut
    if($checkDir = opendir($dir))
    {
        while($file = readdir($checkDir))
        {
            $PathToEvent = "$dir/$file";

            // Dir
            if(is_dir($PathToEvent))
            {
                if(($file != ".") && ($file != ".."))
                {
                    $DirComplete[] = "$PathToEvent";
                   
                    // ** Ny kode
                    if ($SubDir = showDir($PathToEvent))
                    {
                        $DirComplete[] = $SubDir;
                    }
                    // ** Slut

// ** Slettes:                    showDir($PathToEvent);

                    echo "Dir -> $PathToEvent <br>";
                    echo "\n";
                }
            }
        }
        // ** Ny kode:
        return $DirComplete;
        // ** Slut
    }
}
// ** Ny kode: testudskrift af resultatet
$myDir = showDir('C:/PHP');
echo '<br><strong>Resultat af showDir:</strong><br>' . "\r\n";
print_r($myDir);
Avatar billede nielle Nybegynder
26. juni 2005 - 20:05 #8
Lukketid?
Avatar billede lopolla123 Nybegynder
09. september 2005 - 09:06 #9
Undskyld.....det er absolut lukketid - tak for hjælpen, og sagerne virker :-)
Svar gerne - lukker inden længe!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester