// 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 <phplist@xxxxxxxxxxxxxxx>: > > 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 > >