Doorzoeken van mappen
Ik ben op zoek naar een functie om te zoeken binnen een map op een mapnaam (zie voorbeeld)
De mapnaam kan zich op hetzelfde nivo bevinden, maar ook op een nivo dieper of misschien nog dieper.
Voorbeeld:
pathnaarmap/foto/thumb
pathnaarmap/foto/album1/thumb
pathnaarmap/foto/album2/fotograaf1/thumb
pathnaarmap/foto/album2/fotograaf2/thumb
pathnaarmap/foto/album3/fotograaf1/thumb
pathnaarmap/foto/album3/fotograaf2/thumb
De reden dat ik dit wil is om vanuit het fotoalbum van Arjan Kapteijn op mijn frontpagina een random foto banner te plaatsen.
De banner zelf maken lukt mij goed, maar om in de mappenstructuur te zoeken en dan een random foto er uit te spugen vind ik lastig.
Zou zo'n functie traag zijn, wat denken jullie?
De mapnaam kan zich op hetzelfde nivo bevinden, maar ook op een nivo dieper of misschien nog dieper.
Voorbeeld:
pathnaarmap/foto/thumb
pathnaarmap/foto/album1/thumb
pathnaarmap/foto/album2/fotograaf1/thumb
pathnaarmap/foto/album2/fotograaf2/thumb
pathnaarmap/foto/album3/fotograaf1/thumb
pathnaarmap/foto/album3/fotograaf2/thumb
De reden dat ik dit wil is om vanuit het fotoalbum van Arjan Kapteijn op mijn frontpagina een random foto banner te plaatsen.
De banner zelf maken lukt mij goed, maar om in de mappenstructuur te zoeken en dan een random foto er uit te spugen vind ik lastig.
Zou zo'n functie traag zijn, wat denken jullie?
Je zou eens naar de directoryIterator kunnen kijken...
Ik heb hier een voorbeeld, deze haalt alle mappen op, en plaatst alle mappen en submappen + bestanden in een array:
Voorbeeld van een output:
Code (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
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
<?php
$savedPaths = array();
function loadFiles($map){
$arr = array();
$iterator = new RecursiveDirectoryIterator($map);
foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST) as $bestand){
if($bestand->isFile() || $bestand->isDir())$arr[]=$bestand->getFileName();
}
return $arr;
}
function loadFolder($map){
$arr = array();
$savedPaths = array();
$iterator = new RecursiveDirectoryIterator($map);
$b=0;
foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST) as $bestand){
if(!in_array($bestand->getPath(),$savedPaths)){
$path = explode('\\',$bestand->getPath());
$arr[] = $path;
$savedPaths[] = $bestand->getPath();
$arr[$b]['files'] = loadFiles($savedPaths[$b]);
$b++;
}
}
/*echo '<pre>';
print_r($savedPaths);
echo '</pre>';*/
return $arr;
}
$mappen = loadFolder('.');
echo '<pre>';
print_r($mappen);
echo '</pre>';
?>
$savedPaths = array();
function loadFiles($map){
$arr = array();
$iterator = new RecursiveDirectoryIterator($map);
foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST) as $bestand){
if($bestand->isFile() || $bestand->isDir())$arr[]=$bestand->getFileName();
}
return $arr;
}
function loadFolder($map){
$arr = array();
$savedPaths = array();
$iterator = new RecursiveDirectoryIterator($map);
$b=0;
foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST) as $bestand){
if(!in_array($bestand->getPath(),$savedPaths)){
$path = explode('\\',$bestand->getPath());
$arr[] = $path;
$savedPaths[] = $bestand->getPath();
$arr[$b]['files'] = loadFiles($savedPaths[$b]);
$b++;
}
}
/*echo '<pre>';
print_r($savedPaths);
echo '</pre>';*/
return $arr;
}
$mappen = loadFolder('.');
echo '<pre>';
print_r($mappen);
echo '</pre>';
?>
Voorbeeld van een output:
Code (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
46
47
48
49
50
51
52
53
54
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
46
47
48
49
50
51
52
53
54
Array
(
[0] => Array
(
[0] => .
[files] => Array
(
[0] => directory.php
[1] => map1
[2] => bestand.txt
[3] => bestand2.txt
[4] => subsubmap1
[5] => submap1
[6] => submap2
[7] => map2
)
)
[1] => Array
(
[0] => .
[1] => map2
[2] => submap1
[files] => Array
(
[0] => bestand.txt
[1] => bestand2.txt
[2] => subsubmap1
)
)
[2] => Array
(
[0] => .
[1] => map2
[2] => submap1
[3] => subsubmap1
[files] => Array
(
[0] => bestand2.txt
)
)
[3] => Array
(
[0] => .
[1] => map2
[files] => Array
(
[0] => bestand.txt
[1] => bestand2.txt
[2] => subsubmap1
[3] => submap1
[4] => submap2
)
)
)
(
[0] => Array
(
[0] => .
[files] => Array
(
[0] => directory.php
[1] => map1
[2] => bestand.txt
[3] => bestand2.txt
[4] => subsubmap1
[5] => submap1
[6] => submap2
[7] => map2
)
)
[1] => Array
(
[0] => .
[1] => map2
[2] => submap1
[files] => Array
(
[0] => bestand.txt
[1] => bestand2.txt
[2] => subsubmap1
)
)
[2] => Array
(
[0] => .
[1] => map2
[2] => submap1
[3] => subsubmap1
[files] => Array
(
[0] => bestand2.txt
)
)
[3] => Array
(
[0] => .
[1] => map2
[files] => Array
(
[0] => bestand.txt
[1] => bestand2.txt
[2] => subsubmap1
[3] => submap1
[4] => submap2
)
)
)
Wow dat is een snelle reactie!
Maar ik zie dat je PHP 5.1 nodig hebt. Ik draai nog op PHP 4.4.8.
Maar ik zie dat je PHP 5.1 nodig hebt. Ik draai nog op PHP 4.4.8.
Tijd om te upgraden?
RecursiveDirectoryIterator is een verdomt handige functie :).
RecursiveDirectoryIterator is een verdomt handige functie :).
Ik ben in dit geval afhankelijk van mijn gesponserde hosting(voor een sportvereniging) dus dat is op dit moment geen optie.
Maar als ik zo door de functie heen kijk ziet het er idd verdraait handig uit.
Waar zou ik gebruik van kunnen maken in mijn geval?
Maar als ik zo door de functie heen kijk ziet het er idd verdraait handig uit.
Waar zou ik gebruik van kunnen maken in mijn geval?
Gewijzigd op 01/01/1970 01:00:00 door Martijn Roverts
Dan zou met opendir enz alle mappen kunnen doorzoeken en in een array kunnen gooien, maar dat is wel lastig om dat recursief te krijgen.
Er zal ongetwijfeld op internet ook wel een recursief script te vinden zijn die met opendir werkt.
Er zal ongetwijfeld op internet ook wel een recursief script te vinden zijn die met opendir werkt.
Bedankt! Ik ga er mee aan de slag en als ik nog vragen heb gooi ik ze hier weer naar binnen.




