Re: counting with leading zeros
| From: | brian | Date: | Wed, 26 Sep 2007 19:58:48 +0000 |
| Subject: | Re: counting with leading zeros | ||
| References: | 1 2 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-262492@lists.php.net to get a copy of this message | ||
Robert Cummings wrote:
On Wed, 2007-09-26 at 15:11 -0400, brian wrote:It needs basename here because the array has the full path of each file.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)) {<?php function getNextImageIndex( $path, $prefix ) {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.// // Matches files like foo_123.png // $pattern = '/.*_([[:digit:]]+)\.[[:alpha:]]{3}$/';$filenames = glob( "${path}${prefix}*" ); if( $filenames ) { sort( $filenames );$last = array_pop( $filenames );
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.$nextIndex = (int)preg_replace( $pattern, '$1', $last ) + 1;return str_pad( $nextIndex, 2, '0', STR_PAD_LEFT ); }return '01';} ?>
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