By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
448,669 Members | 1,654 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 448,669 IT Pros & Developers. It's quick & easy.

Some array counting math

P: n/a
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 ***
Nov 27 '07 #1
Share this Question
Share on Google+
4 Replies


P: n/a
On Nov 27, 7:25 pm, frizzle <phpfriz...@gmail.comwrote:
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
Nov 27 '07 #2

P: n/a
On Nov 27, 10:16 pm, Kailash Nadh <kailash.n...@gmail.comwrote:
On Nov 27, 7:25 pm, frizzle <phpfriz...@gmail.comwrote:
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
Thank you very much for your quick help!
Not to be a nag though, but if i store other numerical values in the
array (like filemtime), wouldn't they be counted as well?

Would it be better to give each file a ['size'] key? In the best case,
i thought, it would be best to somehow perform the count at the same
time as doing the first loop, so you wouldn't have to run unnecessary
loop, or am i wrong?

Thanks a lot again though!!

(The '->' part doesn't have to be there, it was merely a visual
"guide" for me ...)
Nov 27 '07 #3

P: n/a
On Nov 27, 9:45 pm, frizzle <phpfriz...@gmail.comwrote:
On Nov 27, 10:16 pm, Kailash Nadh <kailash.n...@gmail.comwrote:
On Nov 27, 7:25 pm, frizzle <phpfriz...@gmail.comwrote:
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

Thank you very much for your quick help!
np ;)
Not to be a nag though, but if i store other numerical values in the
array (like filemtime), wouldn't they be counted as well?

Would it be better to give each file a ['size'] key? In the best case,
i thought, it would be best to somehow perform the count at the same
time as doing the first loop, so you wouldn't have to run unnecessary
loop, or am i wrong?

Thanks a lot again though!!

(The '->' part doesn't have to be there, it was merely a visual
"guide" for me ...)
Yes, extra keys would cause the function not to work.
Like you said, a 'size' key would get rid of all the confusion. If you
get it there, simply get rid of the regex line and add the value of
the 'size' key to $size.

--
Kailash Nadh | http://kailashnadh.name
Nov 27 '07 #4

P: n/a
On Nov 27, 10:51 pm, Kailash Nadh <kailash.n...@gmail.comwrote:
On Nov 27, 9:45 pm, frizzle <phpfriz...@gmail.comwrote:
On Nov 27, 10:16 pm, Kailash Nadh <kailash.n...@gmail.comwrote:
On Nov 27, 7:25 pm, frizzle <phpfriz...@gmail.comwrote:
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
Thank you very much for your quick help!

np ;)
Not to be a nag though, but if i store other numerical values in the
array (like filemtime), wouldn't they be counted as well?
Would it be better to give each file a ['size'] key? In the best case,
i thought, it would be best to somehow perform the count at the same
time as doing the first loop, so you wouldn't have to run unnecessary
loop, or am i wrong?
Thanks a lot again though!!
(The '->' part doesn't have to be there, it was merely a visual
"guide" for me ...)

Yes, extra keys would cause the function not to work.
Like you said, a 'size' key would get rid of all the confusion. If you
get it there, simply get rid of the regex line and add the value of
the 'size' key to $size.

--
Kailash Nadh |http://kailashnadh.name
Great, thanks a lot! I'll probably sadly enough won't have any time
before tomorrow to take a look at it, but i'm confident i can get it
to work! :)

And my remark of doing the counting loop at the same time as the
initial loop, or is that peanuts (in calculating power/speed) for PHP?

Thanks again for helping me so far!
Nov 28 '07 #5

This discussion thread is closed

Replies have been disabled for this discussion.