|
Posted by Kailash Nadh on 11/27/07 21:16
On Nov 27, 7:25 pm, frizzle <phpfriz...@gmail.com> wrote:
> Hi there,
>
> I have a function to create an array of all files in a certain folder,
> so i can display the structure.
> The actual function is below the message, as is an example of its
> output.
>
> As one can see, the filesize is also stored in the array (more info
> will be added, like filemtime),
> what i need is to sum all bytes per folder.
>
> So if i have e.g.
>
> - folder_1_level1 -> size file 1 / 96
> * file_1
> * file_2
>
> - folder_1_level2 -> size file 3, 4, 7, 8, 9
> * file_3
> * file_4
> - folder_1_level3 -> size file 7, 8, 9
> * file_7
> * file_8
> * file_9
>
> - folder_2_level2 -> size file 5, 6
> * file_5
> * file_6
>
> The latter should give me the sum of all filesizes in there,
> folder_level2 should give me folder_level3's size PLUS other files/
> folders that are in folder_level2, and then, folder_level1 should have
> the size of all files in there down the entire tree.
>
> I hope it's clear and that someone can help me.
>
> Cheers.
>
> *** FUNCTION CODE ***
>
> function mapit( $dir = '.', $loop = 0, $parent = false ){
> $handle = @opendir( $dir );
> while( ( $file=readdir( $handle ) ) !== false ){
> if( $file != '.' && $file != '..' ){
> $point = $dir."/".$file;
> $fileSize = filesize( $dir.'/'.$file );
> if( is_dir( $point ) )
> $info['dirs'][$file] = mapit( $point , $loop+1, $file );
> else
> $info['files'][$file] = $parent.' -> '.$fileSize;
> }
> }
> return $info;
>
> }
>
> $structure = mapit();
> print_r( $structure );
>
> *** /FUNCTION CODE ***
>
> *** RESULT EXAMPLE ***
>
> Array
> (
> [dirs] => Array
> (
> [upload] => Array
> (
> [files] => Array
> (
> [index.htm] => upload -> 1391
> [index.php] => upload -> 23
> [upload.php] => upload -> 7733
> )
>
> [dirs] => Array
> (
> [img] => Array
> (
> [files] => Array
> (
> [0.jpg] => img -> 36866
> [12.jpg] => img -> 218
> [13.jpg] => img -> 36866
> )
> )
> )
> )
>
> [files] => Array
> (
> [dirs] => Array
> (
> [just-a-dir] =>
> [images] => Array
> (
> [files] => Array
> (
> [lion.jpg] => flip ->
> 350398
> )
> )
> )
> [files] => Array
> (
> [logo.pdf] => files -> 157764
> [tiger.jpg] => files -> 350398
> )
> )
> )
>
> [files] => Array
> (
> [ftp.php] => -> 10238
> [cats.php] => -> 8237
> )
> )
>
> *** /RESULT EXAMPLE ***
This should work. This function recursively goes through a given array
and adds up the sizes.
Note that I had to use regex to get the numerical size as you have
this string, '->' , in there.
function getSize($map) {
$size = 0;
foreach($map as $m) {
if(!is_array($m)) {
preg_match("/[0-9]{1,20}/", $m, $p); // regex to get the size
$size += $p[0];
} else {
$size += getsize($m);
}
}
return $size;
}
$structure = mapit();
echo getsize($structure['dirs']['upload']);
--
Kailash Nadh | http://kailashnadh.name
Navigation:
[Reply to this message]
|