PHP代码,用于生成外观良好的优惠券代码(字母和数字的混合)
对于一个电子商务网站,我想生成一个随机优惠券代码,看起来比随机生成的值更好。它应该是一个可读的优惠券代码,全部为大写,没有特殊字符,只有字母(a-Z)和数字(0-9) 因为人们可能会在其他地方读出来/打印出来,所以我们也需要让它成为一个易于沟通的价值观,可能有8-10个字符长 大概是,PHP代码,用于生成外观良好的优惠券代码(字母和数字的混合),php,random,Php,Random,对于一个电子商务网站,我想生成一个随机优惠券代码,看起来比随机生成的值更好。它应该是一个可读的优惠券代码,全部为大写,没有特殊字符,只有字母(a-Z)和数字(0-9) 因为人们可能会在其他地方读出来/打印出来,所以我们也需要让它成为一个易于沟通的价值观,可能有8-10个字符长 大概是, AHS3DJ6BW B83JS1HSK (我打了那个,所以它不是随机的) 给你 function randr($j = 8){ $string = ""; for($i=0;$i < $j;$i
AHS3DJ6BW
B83JS1HSK
(我打了那个,所以它不是随机的)
给你
function randr($j = 8){
$string = "";
for($i=0;$i < $j;$i++){
srand((double)microtime()*1234567);
$x = mt_rand(0,2);
switch($x){
case 0:$string.= chr(mt_rand(97,122));break;
case 1:$string.= chr(mt_rand(65,90));break;
case 2:$string.= chr(mt_rand(48,57));break;
}
}
return strtoupper($string); //to uppercase
}
函数randr($j=8){
$string=“”;
对于($i=0;$i<$j;$i++){
srand((双)微时间()*1234567);
$x=百万兰特(0,2);
交换机($x){
案例0:$string.=chr(mt_rand(97122));中断;
案例1:$string.=chr(mt_rand(65,90));中断;
案例2:$string.=chr(mt_rand(48,57));break;
}
}
将strtoupper($string);//返回为大写
}
$chars=“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”;
$res=”“;
对于($i=0;$i<10;$i++){
$res.=$chars[mt_rand(0,strlen($chars)-1)];
}
您可以通过预先分配$res
字符串并缓存strlen($chars)-1
的结果来优化此设置。这是留给读者的一个练习,因为你可能不会每秒生成数千张优惠券。试试这个:
substr(base_convert(sha1(uniqid(mt_rand())), 16, 36), 0, 10)
函数generateCouponCode($length=8){
$chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$ret='';
对于($i=0;$i<$length;++$i){
$random=str_shuffle($chars);
$ret.=$random[0];
}
返回$ret;
}
您可以在php兰德手册中找到很多函数我喜欢这个
<?php
//To Pull 8 Unique Random Values Out Of AlphaNumeric
//removed number 0, capital o, number 1 and small L
//Total: keys = 32, elements = 33
$characters = array(
"A","B","C","D","E","F","G","H","J","K","L","M",
"N","P","Q","R","S","T","U","V","W","X","Y","Z",
"1","2","3","4","5","6","7","8","9");
//make an "empty container" or array for our keys
$keys = array();
//first count of $keys is empty so "1", remaining count is 1-7 = total 8 times
while(count($keys) < 8) {
//"0" because we use this to FIND ARRAY KEYS which has a 0 value
//"-1" because were only concerned of number of keys which is 32 not 33
//count($characters) = 33
$x = mt_rand(0, count($characters)-1);
if(!in_array($x, $keys)) {
$keys[] = $x;
}
}
foreach($keys as $key){
$random_chars .= $characters[$key];
}
echo $random_chars;
?>
为什么不保持简单
<?php
echo strtoupper(uniqid());
?>
始终返回13个字符长的大写随机代码。如果这些代码没有安全要求,那么就不需要随机生成代码。我只会使用增量ID,比如由您使用的任何RDBMS生成的ID。或者,如果您有不同类型的优惠券,您可以在代码前面加上前缀,例如:
CX00019 QZ0001C
CX0001A QZ0001D
CX0001B QZ0001E
或者,您甚至可以在优惠券中使用字典中的单词,因为这样的优惠券代码更容易记住,用户输入速度更快。像Dreamhost这样的公司将其用于促销代码,例如:
Promo60
NoSetupFee
YELLOWGORILLA82
其中一些显然是人为创建的(您可以选择),但也可以使用字典列表生成。但是,即使它们是随机生成的无意义短语,字符遵循逻辑模式的事实仍然使其比类似
R7QZ8A92F1
的东西更易于使用。因此,我强烈建议不要仅仅因为“看起来很酷”就使用后一种优惠券代码。您的客户会感谢您。您可以使用优惠券代码生成器PHP类文件生成N个优惠券及其可自定义的优惠券,并使用各种选项添加带有自己前缀和后缀的自己的掩码
$size = 12;
$string = strtoupper(substr(md5(time().rand(10000,99999)), 0, $size));
例如:
优惠券::生成(8);//J5BST6NQ
(相关)作为问题的旁白,请确保保留已用钥匙的记录,以免创建重复!哇-谢谢你们!我们能对这些函数的速度做出一些估计(或真实数据!)吗?我在Windows机器上试了一个,花了一秒钟就弹出了5个!由于您可能需要跟踪结果,以避免创建重复的代码(如Stephen所建议的),因此您可以预先计算一大堆代码并将它们存储在数据库中。然后,您可以抓住下一行,并将其标记为已使用。这也可能有助于克服任何速度问题。如果这是供人们阅读和交流的,您可能希望排除I
,1
,O
和0
。现在,请确保其添加的数字不超过4位:)@电源不是问题中的要求:p此选项的性能为0.442150159668秒10000@QAQ对于未优化的版本,我得到了0.652;对于优化的版本,我得到了0.475,得到了100000(不是10000)。您的计算机似乎不是很快。@QAQuest-“有了O 0,我1就被删除了。”wut?稍微改变了一下:开关($x){case 0:$string.=chr(mt_rand(65,90));中断;case 1:$string.=chr(mt_rand(48,57));中断;}10000所用的时间,1.667200088501秒($x=mt rand(0,2);>$x=百万兰特(0,1);由于案例2不存在,我添加了strtoupper以避免修改上层代码,以防他想使用小写:)@QAQuest:No,此代码将返回一个由十个随机字母数字字符组成的字符串。如果您想要大写,请使用strtoupper
。。。0.18964600563049秒为10000秒。但是它似乎不是太随机…前6-8个字符在我的机器上是相同的..您可以通过添加前缀参数来扩展uniqid()函数:strtoupper(uniqid(substr(sha1(time()),0,2));为了得到第一个元素,你洗牌了整个字符串?
CX00019 QZ0001C
CX0001A QZ0001D
CX0001B QZ0001E
Promo60
NoSetupFee
YELLOWGORILLA82
$size = 12;
$string = strtoupper(substr(md5(time().rand(10000,99999)), 0, $size));