[PHP] Recursief dir doorlopen en in platte array stoppen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Stel, ik heb de volgende dir tree:
code:
1
2
3
4
5
6
7
images
   system
      editor
      templates
   user
      uploads
        vrijdag

Ik probeer nu een functie te maken waarmee ik deze tree in een array kan weergeven:
code:
1
2
3
4
5
6
7
8
9
Array (
  [images]    => images/
  [system]    => images/system/
  [editor]    => images/system/editor/
  [templates] => images/system/templates/
  [user]      => images/user/
  [uploads]   => images/user/uploads/
  [uploads]   => images/user/uploads/vrijdag/
)

Op het moment heb ik de volgende functie:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function dir_tree($dir)
{
  $handle = opendir($dir);
  while (false !== ($file = readdir($handle)))
  {
    if ($file != '.' && $file != '..')
    {
      $path = $dir.$file;
      if (is_dir($path))
      {
        $output[$file] = $path;
        dir_tree($path);
      }
    }
  }
  closedir($handle);
  return isset($output) ? $output : false;
}

Het gaat fout in regel x. Ik roep klaarblijkelijk dir_tree() niet correct aan om bovenstaande array te krijgen. Ik heb al verschillende oplossingen geprobeerd, zoals
PHP:
1
2
3
4
5
6
$output[$file] = $path;
$output[$file] = dir_tree($path);

// en

$output[] = array_merge(dir_tree($path), $output);
Deze brengen alleen een array als output die nog veel verder van huis ligt dan de originele functie. Ook heb ik op PHP.net gezocht naar een oplossing, maar daar worden alleen maar functies gegeven die array's terugggeven die zelf ook meerdere niveau's hebben:
PHP:
1
$output[$file] = dir_tree($path);
Maar dat heb ik dus juist niet nodig :) Kan iemand mij zeggen wat ik fout doe?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 20:38

alienfruit

the alien you never expected

Ik gebruik de volgende code om php bestanden te includen() werkt prima voor mij...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function Zoeker($dir, $arr=null) {
    if ( is_null( $arr ) ) {
            $arr = array();
        }
    if($handle = @opendir($dir)) {
        while(false !== ($file = readdir($handle))) {
            if(end(explode(".",$file)) == "php")
                $arr[] = $file;
            else if (is_dir($dir."/".$file) && !in_array($file,array(".","..")))
                Zoeker($dir."/".$file, $arr);
        }
        closedir($handle);
}

[ Voor 19% gewijzigd door alienfruit op 09-07-2005 14:47 ]


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
alienfruit schreef op zaterdag 09 juli 2005 @ 14:46:
Ik gebruik de volgende code om php bestanden te includen() werkt prima voor mij...
Bedankt voor je reaktie, maar het is geen antwoord op mijn vraag ;)

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Reveller schreef op zaterdag 09 juli 2005 @ 14:29:
Het gaat fout in regel x. Ik roep klaarblijkelijk dir_tree() niet correct aan om bovenstaande array te krijgen. Ik heb al verschillende oplossingen geprobeerd,
Volgens mij moet je ervoor zorgen dat dir_tree altijd een array teruggeeft, oftewel je laatste return veranderen door:

PHP:
1
  return isset($output) ? $output : array();


als je nu in je recursieve aanroep van dir_tree() de output hievan merged met je al bestaande output, dus bv: iets als:

code:
1
        $output = array_merge($output, dir_tree($path));


dan ben je er bijna. Je moet alleen even opletten dat in je recursieve aanroep, je een dir-seperator mist - dus je
PHP:
1
$path = $dir.$file;
moet nog even:

PHP:
1
      $path = $dir.'\\'.$file;


worden :)

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Je kunt dit heel gemakkelijk op 2 manieren doen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function dir_tree($dir)
{
  static $output = array();
  $handle = opendir($dir);
  while (false !== ($file = readdir($handle)))
  {
    if ($file != '.' && $file != '..')
    {
      $path = $dir.$file;
      if (is_dir($path))
      {
        $output[$file] = $path;
        dir_tree($path);
      }
    }
  }
  closedir($handle);
  return $output;
}

of
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function dir_tree($dir)
{
  $output = array();
  $handle = opendir($dir);
  while (false !== ($file = readdir($handle)))
  {
    if ($file != '.' && $file != '..')
    {
      $path = $dir.$file;
      if (is_dir($path))
      {
        $output[$file] = $path;
        $output = array_merge($output, dir_tree($path));
      }
    }
  }
  closedir($handle);
  return $output;
}

Persoonlijk vind ik de 2de optie mooier, maar de eerste kan ook perfect.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
@Elevator, @Michali: dank jullie wel! Het werkt perfect :) Vooral doordat Michali 2 nog die eerste functie erbij gaf, zie ik goed het verschil. Ik heb nu alleen nog het probleem dat ik de array wil laten beginnen met [images] => images/ , dus dat de originele dir ook meegenomen wordt. Helemaal logisch is dat niet - je bekijkt immers de inhoud van de dir en daar hoort de dir zelf niet bij - maar ik heb het nodig voor mijn systeem :) Wat denken jullie - toevoegen aan de funcie of daarbuiten de array aanvullen?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

Verwijderd

elevator schreef op zaterdag 09 juli 2005 @ 15:59:
moet nog even:

PHP:
1
      $path = $dir.'\\'.$file;


worden :)
PHP:
1
$path = $dir . DIRECTORY_SEPARATOR . $file;

;)

Acties:
  • 0 Henk 'm!

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Verwijderd schreef op zaterdag 09 juli 2005 @ 17:02:
PHP:
1
$path = $dir . DIRECTORY_SEPARATOR . $file;

;)
Ahh, die kende ik nog niet. Ik gebruik normaal eigenlijk altijd '/' aangezien dat ook op Windows werkt. In bovenstaand voorbeeld schijnbaar niet 8)7 :P
Pagina: 1