Re: Some array counting math

This is a discussion on Re: Some array counting math within the PHP Language forums, part of the PHP Programming Forums category; On Nov 27, 7:25 pm, frizzle <phpfriz...@gmail.com> wrote: > Hi there, > > I have ...


Go Back   Usenet Forums > PHP Programming Forums > PHP Language

FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 11-27-2007
Kailash Nadh
 
Posts: n/a
Default Re: Some array counting math

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
Reply With Quote
  #2 (permalink)  
Old 11-27-2007
frizzle
 
Posts: n/a
Default Re: Some array counting math

On Nov 27, 10:16 pm, Kailash Nadh <kailash.n...@gmail.com> wrote:
> 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


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 ...)
Reply With Quote
  #3 (permalink)  
Old 11-27-2007
Kailash Nadh
 
Posts: n/a
Default Re: Some array counting math

On Nov 27, 9:45 pm, frizzle <phpfriz...@gmail.com> wrote:
> On Nov 27, 10:16 pm, Kailash Nadh <kailash.n...@gmail.com> wrote:
>
>
>
> > 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

>
> 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
Reply With Quote
  #4 (permalink)  
Old 11-28-2007
frizzle
 
Posts: n/a
Default Re: Some array counting math

On Nov 27, 10:51 pm, Kailash Nadh <kailash.n...@gmail.com> wrote:
> On Nov 27, 9:45 pm, frizzle <phpfriz...@gmail.com> wrote:
>
>
>
> > On Nov 27, 10:16 pm, Kailash Nadh <kailash.n...@gmail.com> wrote:

>
> > > 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

>
> > 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!
Reply With Quote
Reply
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are Off
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On




All times are GMT +1. The time now is 10:03 PM.


Powered by vBulletin® Version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.0.0