Robert Cummings wrote:
On Wed, 2007-09-26 at 15:58 -0400, brian wrote:
Robert Cummings wrote:
On Wed, 2007-09-26 at 15:11 -0400, brian wrote:
I have a directory that contains many images (no, not pr0n,
unfortunately) and i'm working on an admin script for adding to
it. I've got something that works alright but i'm wondering if
there's a Better Way.
Each image is named like: foo_01.jpg, foo_02.jpg, bar_01.jpg,
and so on. When adding a new image it should be assigned the
next number in the series (the prefix is known). Thus, given
the prefix 'bar' i do something like:
function getNextImage($path, $prefix) { $pattern =
"/^${prefix}_([0-9]{2})\.[a-z]{3}$/";
$filenames = glob("${path}${prefix}*"); if
(is_array($filenames) && sizeof($filenames)) {
sort($filenames);
/* eg. 'foo_32.jpg' */ $last = basename(array_pop($filenames));
/* pull the number from the filename */ $count =
intval(preg_replace($pattern, '$1', $last));
/* increment, format with leading zero again if necessary, *
and return it */ return sprintf('%02d', ++$count) } else {
return '01'; } }
Note that there almost certainly will never be more than 99
images to a series. In any case, i don't care about there being
more than one leading zero. One is what i want.
<?php
function getNextImageIndex( $path, $prefix ) { // // Matches
files like foo_123.png // $pattern =
'/.*_([[:digit:]]+)\.[[:alpha:]]{3}$/';
$filenames = glob( "${path}${prefix}*" );
if( $filenames ) { sort( $filenames );
$last = array_pop( $filenames );
It needs basename here because the array has the full path of each
file.
No it doesn't. I changed the pattern to make it simpler.
My bad. I didn't look at it closely enough.
$nextIndex = (int)preg_replace( $pattern, '$1', $last ) + 1;
return str_pad( $nextIndex, 2, '0', STR_PAD_LEFT ); }
return '01'; }
?>
Well, this is almost precisely the same thing i have, save for
using POSIX character classes, str_pad instead of sprintf(), and
incrementing elsewhere. What i was really wondering is if there was
a *much simpler* way to do this, not just re-arranging things.
You asked for a "Better Way". I gave you a "Better Way". I improved
the regex, removed the useless basename() call, performed
incrementation in the extraction step, used better function and
variable names, and used the str_pad() function because sprintf() is
overkill. I also removed your redundant else clause. My version is
much simpler. How much is much? You know... much! Other than using a
database, it doesn't really get any simpler. Although you obviously
have race condition issues also. But that's not getting "simpler".
It's getting more correct but also a bit more complex.
Bad day or something? Did it really seem that i was bitching about your
response? If my response to that gave you the impression i was
complaining, i assure you that i wasn't. I was simply suggesting
that i was wondering if there was a *much* simpler way to do this, ie.
without using several functions to process the filename. Yes, your
version *does* have some improvements. I'm not disagreeing with you.
Perhaps i could have been more forthright in my praise for said
improvements (i'm even going to use some of them--how about that?!)
Note that the moment you get 100 images the code breaks because
_100 sorts before _99 and so you will always write over the 100th
index. To fix this you need to loop through all found files and
pull the index out and record the highest found.
For my purposes, if any series gets much beyond 40 i'll have bigger
problems to worry about. I'm content to not worry about overflow
in this case.
Suit yourself. But better programmer's don't just wave their hands in
the air and hope for the best.
While i agree with you in principle, i'm not interested in that aspect
of it. The application would have halted *long* before it could reach
that many. This is why i went to the trouble of pointing this out in the
original mail. IOW, i'm not stupid; i'm well aware that 100 comes after
99 and that it contains 3 digits, not 2, thanks very much.
b
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php