PHP代码,用于生成外观良好的优惠券代码(字母和数字的混合)

PHP代码,用于生成外观良好的优惠券代码(字母和数字的混合),php,random,Php,Random,对于一个电子商务网站,我想生成一个随机优惠券代码,看起来比随机生成的值更好。它应该是一个可读的优惠券代码,全部为大写,没有特殊字符,只有字母(a-Z)和数字(0-9) 因为人们可能会在其他地方读出来/打印出来,所以我们也需要让它成为一个易于沟通的价值观,可能有8-10个字符长 大概是, AHS3DJ6BW B83JS1HSK (我打了那个,所以它不是随机的) 给你 function randr($j = 8){ $string = ""; for($i=0;$i < $j;$i

对于一个电子商务网站,我想生成一个随机优惠券代码,看起来比随机生成的值更好。它应该是一个可读的优惠券代码,全部为大写,没有特殊字符,只有字母(a-Z)和数字(0-9)

因为人们可能会在其他地方读出来/打印出来,所以我们也需要让它成为一个易于沟通的价值观,可能有8-10个字符长

大概是,

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));