Re: counting with leading zeros
| From: | brian | Date: | Wed, 26 Sep 2007 23:10:09 +0000 |
| Subject: | Re: counting with leading zeros | ||
| References: | 1 2 3 4 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-262497@lists.php.net to get a copy of this message | ||
Robert Cummings wrote:
On Wed, 2007-09-26 at 15:58 -0400, brian wrote:My bad. I didn't look at it closely enough.Robert Cummings wrote:No it doesn't. I changed the pattern to make it simpler.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)) { 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 );
Bad day or something? Did it really seem that i was bitching about your response? If my response to that gave you the impression i was complaining, i assure you that i wasn't. I was simply suggesting that i was wondering if there was a *much* simpler way to do this, ie. without using several functions to process the filename. Yes, your version *does* have some improvements. I'm not disagreeing with you. Perhaps i could have been more forthright in my praise for said improvements (i'm even going to use some of them--how about that?!)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.$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.
While i agree with you in principle, i'm not interested in that aspect of it. The application would have halted *long* before it could reach that many. This is why i went to the trouble of pointing this out in the original mail. IOW, i'm not stupid; i'm well aware that 100 comes after 99 and that it contains 3 digits, not 2, thanks very much. bSuit yourself. But better programmer's don't just wave their hands in the air and hope for the best.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.