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.
> > $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.
> > 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.
Cheers,
Rob.
--
...........................................................
SwarmBuy.com - http://www.swarmbuy.com
Leveraging the buying power of the masses!
...........................................................
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php