PHP - Sequential Numbering Help
I am writing a small program that generates a sequential numbering array. I need to include potentially a prefix, leading zeros, a starting number, a suffix and a quantity and also reverse the generated values.
example: P-000299-001 P-000298-001 P-000297-001 P-000296-001 P-000295-001 P-000294-001 P-000293-001 P-000292-001 P-000291-001 P-000290-001 P-000289-001 Here is my code to generate: <?php $quantity = "100"; $start = "200"; $leadingzeros = "000"; $prefix = "P-"; $suffix = "-001"; $i = $start + $quantity - 1; while ($i >= $start) { echo $prefix . $leadingzeros . $i-- . $suffix . "<br />\n"; } ?> The code all seem to function correctly until I increase the quantity to say 25000 numbers to be generated or if the number string gets too long and the server will just sit and spin until a "cannot be displayed error" appears in IE. It had been suggested to abandone the array and simply write the generated sequence to a file and this is the code to generated the file it - it really works great and is really fast. <?php $startTime = time(); // this is just for measuring execution time $quantity = "25000"; $start = "26000"; $length = 6; $prefix = "P-"; $suffix = "-001"; $file = "test.txt"; $fh = fopen($file, 'w') or die("Could not open $file for writing"); for($ix = 1, $nbr = $start; $ix <= $quantity; $ix++, $nbr--) { fprintf($fh, $prefix.'%0'.$length.'d'.$suffix."\n", $nbr); } // all done, let's see how long it took: $endTime = time(); echo "Script took about " . ($endTime - $startTime) . " seconds to run."; ?> I am using this program to generate numbering files used in the printing industry. The sequential numbering works great. I had to change your code slightly in order to produce a usable numbering file, I had to subtract "1" from the $start+$quantity in order to get the correct amount of numbers. For a start of 1000 and quantity of 10 you had 1010 as your first number and it should actually be 1009 to give you 10 numbers. $fh = fopen($file, 'w') or die("Could not open $file for writing"); for($ix = 1, $nbr = $start+$quantity-1; $ix <= $quantity; $ix++, $nbr--) P-001009-001 P-001008-001 P-001007-001 P-001006-001 P-001005-001 P-001004-001 P-001003-001 P-001002-001 P-001001-001 P-001000-001 Let's think of this as an 8.5" x 11" piece of paper going through a laser printer - if each page had one number on it the sequential number will be great. Anyway, here is the next challenge: Let's say we have one 5.5" x 8.5" on an 8.5" x 11" sheet twice or two up. Each with its own number on the left and right side of the paper. That after printing will be cut and stacked on top of one another and produce a pile that is still in the right order. We need to take the $quantity+$start-1 and divide by 2 and then interleave the two sets of numbers and stop the numbering set at the starting number. easy huh!!! P-001009-001 P-001004-001 P-001008-001 P-001003-001 P-001007-001 P-001002-001 P-001006-001 P-001001-001 P-001005-001 P-001000-001 Here is the code I have for an example: <?php $quantity = "10"; $start = "1000"; $leadingzeros = "00"; $prefix = "P-"; $suffix = "-001"; $i = $start + $quantity - 1; $quantity2 = $quantity / 2; $j = (int)($i - $quantity2); while ($j >= $start) { echo $prefix . $leadingzeros . $i-- . $suffix ."<br />\n" . $prefix . $leadingzeros . $j-- . $suffix . "<br />\n"; } ?> The third option is two completely different 5.5" x 8.5" items and two different numbering schemes on an 8.5" x 11" piece of paper. Here is the code I have been using for it. <?php $quantity = "10"; $start = "1000"; $leadingzeros = "00"; $prefix = "P-"; $suffix = "-001"; $quantity2 = "10"; $start2 = "2000"; $leadingzeros2 = "000"; $prefix2 = "Q-"; $suffix2 = "-005"; $i = $start + $quantity - 1; $k = $start2 + $quantity2 - 1; while ($i >= $start) { echo $prefix . $leadingzeros . $i-- . $suffix . "<br />\n" .$prefix2. $leadingzeros2 . $k-- . $suffix2 . "<br />\n"; } ?> Which produces: P-001009-001 Q-0002009-005 P-001008-001 Q-0002008-005 P-001007-001 Q-0002007-005 P-001006-001 Q-0002006-005 P-001005-001 Q-0002005-005 P-001004-001 Q-0002004-005 P-001003-001 Q-0002003-005 P-001002-001 Q-0002002-005 P-001001-001 Q-0002001-005 P-001000-001 Q-0002000-005 Thanks in advance Similar TutorialsHi everyone reading this, I have used PHP before as a hobby programmer but recently my boss asked me to make a webpage to accept worker's hours and store them in a database. So I realize that in the last few years object oriented style has been added into PHP. I have learnt OOP (C++) about a decade ago and understand the fundamentals of it. If I am writing this website code, am I going to be better off spending the time to get familiar with the new OOP stuff in PHP and use that or would it be better to just use an old sequential style of programming? I know this may seem like apples and oranges and that it varies based on opinion, but maybe there can be reasons for me to use OOP over sequential. For instance, if I write this code to be flexible enough that I can do a basic "worker times" table first, then I might be able to add additional functionality later, like worker details and qualifications, all of which could be brought up with the click of a button. Will it generally be easier to add onto code using OOP? I have a table with an ID column which is the Primary key and auto incremented. I have another column named ORDER that contains a number. This number is used to define the order in which the row data is displayed on a page. When I delete a row, the ORDER column will have a gap and I would like to renumber the subsequent rows to remove the gap. ie: I want to renumber the rows: ID ORDER 1 1 2 2 4 3 5 4 When I insert a new row I want the ORDER row to be given the NEXT sequential number How do I do that using PHP PDO? Thanks This topic has been moved to MySQL Help. http://www.phpfreaks.com/forums/index.php?topic=344739.0 im building a forum and i was wondering how to make page numbers work, so only 10 or 20 posts show up, then it shows page 2, etc. like. 1, 2, 3, 4, 5 even better would be something like phpbb: 1 ... 6, 7, 8 im assuming this is some pretty advanced coding involved.... Code: [Select] <?php $query = "SELECT * FROM forum_posts WHERE topic_no='".$_REQUEST['topic_no']."' ORDER BY date ASC"; $result = mysql_query($query) or die("Error: ".mysql_error()); $fnames = array(); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { $fnames[] = $row; } for ($i = 0; $i < count($fnames); $i++) { $query = "SELECT views FROM forum_posts WHERE topic_no='".$fnames[$i][8]."' AND author='1'"; $result = mysql_query($query) or die("Error: ".mysql_error()); $views = array(); $views = mysql_fetch_array($result, MYSQL_NUM); $query = "SELECT createdate,alliance,rank,country,username FROM users WHERE username='".$fnames[$i][1]."'"; $result = mysql_query($query) or die("Error: ".mysql_error()); $user = array(); while ($row = mysql_fetch_array($result, MYSQL_NUM)) {$data = $row;} $query = "SELECT logo FROM udata WHERE username='".$fnames[$i][1]."'"; $result = mysql_query($query) or die("Error: ".mysql_error()); $logo = array(); while ($row = mysql_fetch_array($result, MYSQL_NUM)) {$logo = $row;} $query = "SELECT COUNT(username) FROM forum_posts WHERE username='$data[4]'"; $result = mysql_query($query) or die("Error: ".mysql_error()); $postc = mysql_fetch_array($result, MYSQL_NUM); $logoi = '<img src="'.$logo[0].'" width="100" height="100" /><br><br>'; $query = "SELECT admin FROM users WHERE username='".$fnames[$i][1]."'"; $result = mysql_query($query) or die("Error: ".mysql_error()); while ($row = mysql_fetch_array($result, MYSQL_NUM)) {$acount = $row;} if ($acount[0] == 1) { $mod[$i] = '<font color="lightgreen">ADMINISTRATOR</font><br>'; } else { $query = "SELECT mteam FROM users WHERE username='".$fnames[$i][1]."'"; $result = mysql_query($query) or die("Error: ".mysql_error()); while ($row = mysql_fetch_array($result, MYSQL_NUM)) {$mcount = $row;} if ($mcount[0] == 1) { $mod[$i] = '<font color="lightgreen">MODERATOR</font><br>'; } } if ($fnames[$i][1] == $info[3]) { $buttons[$i] = ' <div class="forumbuttons"> <form action="forums_edit.php" method="post" class="lineup"> <input type="hidden" name="postid" value="'.$fnames[$i][0].'"> <input type="submit" name="edit" class="submit" value="Edit" /> </form> <form action="forums_topic.php" method="post" class="lineup"> <input type="submit" name="delete" class="submit" value="Delete" /> <input type="hidden" name="postid" value="'.$fnames[$i][0].'"> <input type="hidden" name="username" value="'.$fnames[$i][1].'"> <input type="hidden" name="topicname" value="'.$fnames[$i][2].'"> <input type="hidden" name="forumid" value="'.$fnames[$i][6].'"> <input type="hidden" name="topic_no" value="'.$fnames[$i][8].'"> <input type="hidden" name="author" value="'.$fnames[$i][5].'"> </form> </div> '; } else { $buttons[$i] = ' '; } echo ' <tr> <td class="variable" align="center" valign="top"><a class="variable" href="browse.php?name='.$fnames[$i][1].'">'.$fnames[$i][1].'</a></td> <td class="variable" align="left">Post Subject: <a class="noline">'.$fnames[$i][2].'</a></td> </tr> <tr> <td align="left" valign="top" class="variable"> <div style="margin-left:10px"> '.$mod[$i].' '.$logoi.' Joined: <a class="noline">'.date('d-m-Y', $data[0]).'</a><br> Posts: <a class="noline">'.$postc[0].'</a><br> Alliance: <a class="noline">'.$data[1].'</a><br> Rank: <a class="noline">'.$data[2].'</a><br> From: <a class="noline">'.$data[3].'</a><br> </div></td> <td align="left" valign="top" class="variable"><a class="noline">'.$fnames[$i][4].'</a> </td> </tr> <tr> <td align="left" valign="center" class="variable"><div style="margin-left:10px"><a href="#top">Top</a></div></td> <td class="variable" align="right" valign="top"><div class="forumbuttons">'.$buttons[$i].'</div></td> </tr> '; } ?> </table> <br> <form action="forums_topic.php" method="post"> <table width="540" class="metal" cellpadding="1" cellspacing="1"> <tr> <td colspan="2" class="head">Reply</td> </tr> <tr> <td width="108" height="19" valign="top" class="variable"><div align="left">Message body:<br> <a class="noline">Enter your message here, it may contain no more than <STRONG>60000</STRONG> characters.</a></div></td> <td width="381" class="variable"><textarea name="message" id="message" cols="60" rows="8"></textarea></td> </tr> <tr> <td height="19" colspan="2" valign="top" class="variable"><div align="center"> <input type="hidden" value="<?php echo $forumid;?>" name="forumid"> <input type="hidden" value="<?php echo $_REQUEST['topic_no'];?>" name="topic_no"> <input type="hidden" value="<?php echo $tname;?>" name="topicname"> <input name="posted_reply" type="submit" class="submit" id="button" value="Submit"> </div></td></tr> </table> </form> <?php } ?> the code above is the output for the posts. help would muchly be appreciated! Sorry if this belongs in the MySQL section. I figured it might be more of a PHP thing. I have a database where rows each have a number, which is used to determine what order they appear in on my PHP page. But right now they aren't like 1, 2, 3, 4, etc. They are a little jumbled because of deleting some and changing some, so they're more like 1, 3, 7, etc. Is there a way to make them 1, 2, 3, 4 with PHP? Like, put them in order and number them accordingly? Thanks. function forum_number_format($number, $decimals = 0) { global $lang_common; $x = round($number); $x_number_format = number_format($x); $x_array = explode(',', $x_number_format); $x_parts = array('k', 'm', 'b', 't'); $x_count_parts = count($x_array) - 1; $x_display = $x; $x_display = $x_array[0] . ((int) $x_array[1][0] !== 0 ? '.' . $x_array[1][0] : ''); $x_display .= $x_parts[$x_count_parts - 1]; return $x_display; //return is_numeric($number) ? number_format($number, $decimals, $lang_common['lang_decimal_point'], $lang_common['lang_thousands_sep']) : $number; }Let's take a look at this code. This is VERY, VERY hard for me to understand. But it's essentially converting numbers to their kilobyte equivalent. (For example: 1000 = 1k. 25000 = 25k 15000 = 15k My issue is.. What happens when the number is 1321 This will output 1.3k Why? Because it's using the round function on line 4. But, I'm trying to get it to display 1.32k Any idea how to do this? I've been trying: $x = round($number, 1);and other methods but with no luck. Edited by Monkuar, 23 January 2015 - 02:55 PM. We have a php application that is just a form, that takes in data to a mysql database and then displays that data in queue(php web page) for the client. It has been working for the past 5 or more years. Six weeks ago, the client noticed that the numbering started skipping a number each time a request was entered. It then seemed to stop, now it has started again. See attached image. Some detail he after user has completed web form and hits submit, three fields are populated in the mysql "REQUEST" table, then the actually data from the submitted web form is sent to the ANSWER table. The REQUEST table is in sync and is always populated, and numbering is in sequence but upon submit, the actual data from the request does NOT always go to the ANSWER table hence the "skipping of numbers." What do I even begin looking at/for to determine what happened? Reminder: this is a 5+ year old app that worked fine until maybe 6 weeks ago. No changes have been made to the database or the code base since 2008. The code that adds the data to the ANSWER table [the one that appears to skip] is below. The applicate is in php 4.3.1, mysql 5, linux server. |