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.

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

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.

brian

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to