// glob returns an ordered list (rtfm: man glob)
// relies on the use of the operator ++ to generate string sequences.

function lastFileInSequence($path, $prefix, $first, $suffix) {
    return array_pop(glob($path . "/" . $prefix . str_repeat('?',
strlen($first)) . $suffix));
}

function nextFileInSequence($path, $prefix, $first, $suffix) {
    if ($lastFile = basename(lastFileInSequence($path, $prefix, $first,
$suffix), $suffix)) {
        return ++$lastFile . $suffix;
    } else {
        return $prefix . $first . $suffix;
    }
}

$nextImage = $path . "/" . nextFileInSequence($path, "foo_", "01", ".jpg");

2007/9/26, brian <[EMAIL PROTECTED]>:
>
> 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.
>
> brian
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>

Reply via email to