[PHP] Recursief mappen listen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Speedener
  • Registratie: September 2000
  • Laatst online: 18-09 12:54
Haai :w

Ik zit met het volgende:
Ik heb een fotoboek gemaakt, het fotoboek leest mappen uit die op de server staan. En alle plaatjes die dan in een gekozen map staan worden getoont.

Nu ben ik daarvoor een admin-panel aan het maken. En wil ik een mogelijkheid maken om foto's te kunnen verplaatsen. Daarvoor wil ik alle mappen die er zijn listen.

Dus stel, mijn mappen structuur is zo:
code:
1
2
3
4
5
/2004/
/2004/11/06/Verjaardag Sjaak/
/2004/12/20/Ajax Training/
/2005/01/01/Oud en nieuw fotos/
/2005/01/05/Skivakantie

Dan wil ik een selectbox die het volgende eruit ziet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
2004
  11
    06
      Verjaardag Sjaak
  12
    20
      Ajax Training
2005
  01
    01
      Oud en nieuw fotos
    05
      Skivakantie

Maar dat komt er dan wel op neer dat ik alle mappen helemaal moet gaan uitpluizen. Dat zijn dan nu al 13 mappen. Hoe kan ik dat het beste doen ?

Ik zat zelf te denken:
Eerst 1 map diep alle mappen zoeken. En dan weer 1 map dieper alle mappen uitzoeken. Enz enz.

Of heeft iemand een ander idee hoe ik dat makkelijk kan doen ?

[ Voor 7% gewijzigd door Speedener op 03-03-2005 10:43 ]

LG Therma V Split WP: HU143MA.U33-HN1636M NK5


Acties:
  • 0 Henk 'm!

  • UltimateB
  • Registratie: April 2003
  • Niet online

UltimateB

Pomdiedom

Hier staan een aantal handige comments bij die je op weg zullen helpen...

http://nl2.php.net/readdir

Voortaan ff php.net bekijken, hier kan je ze ongeveer alles vinden ;)

"True skill is when luck becomes a habit"
SWIS


Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

Ik zou het recursief doen.

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Persoonlijk zou ik de structuur van een fotoboek opbouwen aan de hand van een database. Lijkt me een stuk flexibeler bij het verplaatsen van foto's en dergelijke. Dus gewoon je foto's uploaden en een foto een uniek nummer geven en in de database zetten. De manier van weergeven is dan ook lekker flexibel (makkelijk sorteren enzo)

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Ik weet niet of je gebruik kan maken van PEAR, maar kijk anders hier eens...

http://pear.php.net/manua...-find.maptreemultiple.php

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • UltimateB
  • Registratie: April 2003
  • Niet online

UltimateB

Pomdiedom

Brakkie schreef op donderdag 03 maart 2005 @ 10:52:
Persoonlijk zou ik de structuur van een fotoboek opbouwen aan de hand van een database. Lijkt me een stuk flexibeler bij het verplaatsen van foto's en dergelijke. Dus gewoon je foto's uploaden en een foto een uniek nummer geven en in de database zetten. De manier van weergeven is dan ook lekker flexibel (makkelijk sorteren enzo)
Dan is het alleen niet zo makkelijk om even een lading foto's op je site te zetten. Je zal dan toch echt per foto moeten gaan aangeven waar hij bij hoort imo.

"True skill is when luck becomes a habit"
SWIS


Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

UltimateB schreef op donderdag 03 maart 2005 @ 10:56:
[...]


Dan is het alleen niet zo makkelijk om even een lading foto's op je site te zetten. Je zal dan toch echt per foto moeten gaan aangeven waar hij bij hoort imo.
Het uploaden kan je gewoon door middel van ftp doen. Je zou dan een scriptje moeten schrijven waarmee je een directory op de server kan selecteren waarnaar je de foto's geupload hebt en waarmee je alle file's kan renamen met een uniek nummer en in de database kan zetten. Daarna kan je genieten van de flexibiliteit van een database bij het displayen van je foto albums.

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • UltimateB
  • Registratie: April 2003
  • Niet online

UltimateB

Pomdiedom

Ah, sterk punt. Zo heb ik het stiekem ook gemaakt tijdje geleden. Maar dan maak ik directories aan met als naam de pk van de fotogroep in de db.

* UltimateB gaat koffie drinken.

"True skill is when luck becomes a habit"
SWIS


Acties:
  • 0 Henk 'm!

  • Speedener
  • Registratie: September 2000
  • Laatst online: 18-09 12:54
Dit is het laatste punt in mijn fotoboek. Dan is hij helemaal af. Kortom ik zie het neit zitten om het te gaan veranderen.
Dit is ook het enige waar ik flink tegenaan liep. Ik maak ik op dit moment helemaal geen gebruik van een DB.

Ik ga eens de comments op php.net napluizen

LG Therma V Split WP: HU143MA.U33-HN1636M NK5


Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Het lijkt me een relatief kleine aanpassing die je van veel gemak voorziet.

Maareh wat lukt je nu precies niet?

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Als je het zo wil doen dan heb je wellicht wat aan de volgende functie:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function tree($dir) 
{
# This functions walks trough a specified directory in the webfolders. A definition list is returned 
# with links to all images found. Files and dirs are shown plain.

# INPUT: a folder place in the web accessible directory (either /var/www/dir/pict or /dir/pict) 
# OUTPUT: a definition list with links to the images found


//format $dir into the right format
$dir = (is_dir($dir)) ? $dir : $_SERVER["DOCUMENT_ROOT"] .$dir;
$dir = rtrim($dir, '/') .'/';

//determine web accesible folder
$webdir = substr($dir, strlen($_SERVER["DOCUMENT_ROOT"]));

//check if $dir really is a directory
if (!is_dir($dir)) { return 'Directory doesn't exist'; }

//start output
$output = "<dl>\n"; //output in definition lists

$handle=opendir($dir);
while (false!==($file = readdir($handle)))
{ 
    if ($file != "." && $file != "..") 
    {
        $output .= " <dt>";
        if (is_dir($dir .$file))
        {
            $new_dir = $dir .$file .'/';
            $output .= 'DIR:' .$file ."</dt>\n <dd>";
            $output .= tree($new_dir) .'</dd>'; //Recurse subdirectories 
        } else {
            $output .= (getimagesize($dir. $file)) ? '<a href="' .$webdir .$file .'">' .$file .'</a>' : $file;
            $output .= '</dt>';
        }
      $output .= "\n";
    } 
}
closedir($handle);

$output .= "</dl>\n";
return $output;
}

Het is niet helemaal wt je zoekt, maar wel een beginnetje. Output van mijn "got-mapje" op de webserver.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik heb even een voorbeeldje gemaakt van hoe ik het zou doen. Heb het niet getest overigens (ik hoop dat dit ongeveer is wat je bedoelt):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php

function getDirs($dir = '.', $depth = 0)
{
    static $outputDirs = array();
    
    $dh = opendir($dir);
    
    while ( $file = readdir($dh) )
    {
        if ( is_dir($dir . "/" . $file) )
        {
            $outputDirs[] = array('depth' => $depth, 'name' => $file);
            
            getDirs($dir . "/" . $file, $depth + 1);
        }
    }
    
    closedir($dh);
    
    return $outputDirs;
}

$dirs = getDirs();

print '<select name="dir">';

foreach ( $dirs as $dir )
{
    print '<option value="' . $dir['name'] . '">' .
        str_repeat('&nbsp;&nbsp;&nbsp;', $dir['depth']) .
        $dir['name'] . '</option>';
}

print '</select>';

?>

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Speedener
  • Registratie: September 2000
  • Laatst online: 18-09 12:54
Bedankt voor jullie hulp. Ik was zelf al aant klooien gegaan.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
function ls ($dir){
   $handle = opendir($dir);
   for(;(false !== ($readdir = readdir($handle)));) {
       if ($readdir != '.' && $readdir != '..') {
           $path = $dir.'/'.$readdir;
           if (is_dir($path))
             $output[$readdir] = ls($path);
           //if(is_file($path)) 
           //  $output[] = $readdir;
       }
   }
   return isset($output) ? $output : false;
   closedir($handle);
}

function showarray ($array, $deep = 0) {
  
  if (is_array($array)) {
    foreach ($array as $a => $b) {
      if ($deep > 0) {
        for ( $i = 0; $i < $deep; $i++)
          echo '&nbsp;&nbsp;';
      }
    
      if (is_array($b)) {
        echo $a . '<br>';
        
        showarray($b, $deep + 1);
      }
      else
        echo $a . '<br>';
    }
    
    return '';
  }
  else
    return FALSE;

}

?>


Alleen nog ff de select inputs maken enzo.. Maar das appeltje eitje ;)

edit: mzz ik moet het path natuurlijk ook nog hebben...

[ Voor 32% gewijzigd door Speedener op 03-03-2005 12:05 ]

LG Therma V Split WP: HU143MA.U33-HN1636M NK5


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
PHP:
1
for(;(false !== ($readdir = readdir($handle)));) {
:? wel eens while gezien?

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Speedener
  • Registratie: September 2000
  • Laatst online: 18-09 12:54
Ahjoh, leuk toch dit :P

Ik heb het veranderd :)

[ Voor 16% gewijzigd door Speedener op 03-03-2005 12:48 ]

LG Therma V Split WP: HU143MA.U33-HN1636M NK5

Pagina: 1