生成规则设计

简介:

每一个电子商务网站,现在有一种或多种类型的优惠/折扣/优惠券系统,给大家分享一下如何在PHP生成唯一的促销/折扣码

Java代码   收藏代码
  1. <?php  
  2. /**  
  3.  * @param int $no_of_codes//定义一个int类型的参数 用来确定生成多少个优惠码 
  4.  * @param array $exclude_codes_array//定义一个exclude_codes_array类型的数组 
  5.  * @param int $code_length //定义一个code_length的参数来确定优惠码的长度 
  6.  * @return array//返回数组 
  7.  */  
  8. function generate_promotion_code($no_of_codes, $exclude_codes_array = '', $code_length = 4) {  
  9.     $characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";  
  10.     $promotion_codes = array(); //这个数组用来接收生成的优惠码  
  11.     for ($j = 0; $j < $no_of_codes; $j++) {  
  12.         $code = "";  
  13.         for ($i = 0; $i < $code_length; $i++) {  
  14.             $code.= $characters[mt_rand(0, strlen($characters) - 1) ];  
  15.         }  
  16.         //如果生成的4位随机数不再我们定义的$promotion_codes函数里面  
  17.         if (!in_array($code, $promotion_codes)) {  
  18.             if (is_array($exclude_codes_array)) //  
  19.             {  
  20.                 if (!in_array($code, $exclude_codes_array)) //排除已经使用的优惠码  
  21.                 {  
  22.                     $promotion_codes[$j] = $code;  
  23.                     #将生成的新优惠码赋值给promotion_codes数组  
  24.                 } else {  
  25.                     $j--;  
  26.                 }  
  27.             } else {  
  28.                 $promotion_codes[$j] = $code; //将优惠码赋值给数组                 
  29.             }  
  30.         } else {  
  31.             $j--;  
  32.         }  
  33.     }  
  34.     return $promotion_codes;  
  35. }  
  36. echo '<h1>Promotion / Discount Codes</h1>';  
  37. echo '<pre>';  
  38. print_r(generate_promotion_code(50''4));  
  39. echo '</pre>';  
  40. ?>   

discuz 卡密生成规则设计:DZ2011QSYLP54985V6Q9T

Java代码   收藏代码
  1. var $rulekey = array("str" => "\@""num" => "\#""full" => "\*");  
  2. var $rulemap_str = "ABCDEFGHIJKLMNPQRSTUVWXYZ";  
  3. var $rulemap_num = "123456789";  
  4.   
  5. function make($rule = '', $num = 1)  
  6. {  
  7.     $makeRule = empty($rule) ? "@@@@####*" : trim($rule);  
  8.     if (empty($makeRule)) {  
  9.         return -1//制卡规则为空  
  10.     }  
  11.     for ($i = 0; $i < $num; $i++) {  
  12.         $attempt = 0;  
  13.         do {  
  14.             if ($attempt >= self::CODE_GENERATION_ATTEMPTS) {  
  15.                 die('生成卡时跳过重复卡号上限次数用完.');  
  16.             }  
  17.             $card = $this->createCardNo($makeRule);  
  18.             $attempt++;  
  19.         } while ($this->exists($card));  
  20.         //saveCard($card);  
  21.     }  
  22.     return true;  
  23. }  
  24.   
  25. function createCardNo($makeRule)  
  26. {  
  27.     if ($ruleReturn = $this->checkrule($makeRule)) {  
  28.         $card = $makeRule;  
  29.         if (is_array($ruleReturn)) {  
  30.             foreach ($ruleReturn AS $key => $val) {  
  31.                 $search = array();  
  32.                 foreach ($val AS $skey => $sval) {  
  33.                     $search[] = '/' . $this->rulekey[$key] . '/';  
  34.                 }  
  35.                 $card = preg_replace($search, $val, $card, 1);  
  36.             }  
  37.         }  
  38.         return $card;  
  39.     } else {  
  40.         return 0;  
  41.     }  
  42. }  
  43.   
  44. function checkrule($rule)  
  45. {  
  46.     if (!preg_match("/^[A-Z0-9\@|\#|\*]+$/i", $rule)) {  
  47.         return -2;  
  48.     }  
  49.   
  50.     $ruleReturn = array();  
  51.     foreach ($this->rulekey AS $key => $val) {  
  52.         $match = array();  
  53.         preg_match_all("/($val){1}/i", $rule, $match);  
  54.         $number[$key] = count($match[0]);  
  55.         if ($number[$key] > 0) {  
  56.             for ($i = 0; $i < $number[$key]; $i++) {  
  57.                 switch ($key) {  
  58.                     case 'str':  
  59.                         $rand = mt_rand(0, (strlen($this->rulemap_str) - 1));  
  60.                         $ruleReturn[$key][$i] = $this->rulemap_str[$rand];  
  61.                         break;  
  62.                     case 'num':  
  63.                         $rand = mt_rand(0, (strlen($this->rulemap_num) - 1));  
  64.                         $ruleReturn[$key][$i] = $this->rulemap_num[$rand];  
  65.                         break;  
  66.                     case 'full':  
  67.                         $fullstr = $this->rulemap_str . $this->rulemap_num;  
  68.                         $rand = mt_rand(0, (strlen($fullstr) - 1));  
  69.                         $ruleReturn[$key][$i] = $fullstr[$rand];  
  70.                         break;  
  71.                 }  
  72.             }  
  73.         }  
  74.     }  
  75.     return $ruleReturn;  
  76. }  

 

 

相关文章
|
1月前
|
数据采集 监控 搜索推荐
质量规则支持自定义属性,规则管理更便捷
随着企业数据治理开展到一定阶段,对质量监控规则的精细化管理诉求进一步提升,需要为质量规则配置更多属性信息以支持后续的统计的分析。Dataphin V4.0版本新增了自定义质量规则属性的能力,通过简单的配置即可实现灵活、高效的规则管理,满足多样化诉求。
277 0
|
1月前
编程笔记 00 目标规则
编程笔记 00 目标规则
|
6月前
|
安全 Java 容器
happens-before规则
happens-before规则
16 0
|
6月前
【每日一记】ACL基本概念(匹配流量、路由条目、书写、规则.....)
【每日一记】ACL基本概念(匹配流量、路由条目、书写、规则.....)
157 1
|
8月前
|
监控 Dubbo Linux
微服务 热点流控 规则-授权 系统规则 自定义返回
微服务 热点流控 规则-授权 系统规则 自定义返回
63 0
|
9月前
所谓“规则”
所谓“规则”
44 0
|
10月前
|
编译器 程序员 C++
C++11之一般化的SFINAE规则
C++11之一般化的SFINAE规则
48 0
|
移动开发 JSON 小程序
动态路由 TheRouter 的设计与实践
这篇文章是我在 2022【[GIAC 全球互联网架构大会](https://giac.msup.com.cn/2022sh/course?id=16425)】分享时所讲内容的文字版本,修改删减了演讲时的冗余言语,现开放给大家阅读,希望能给买不到票参加分享的 开源实验室 读者带来帮助。
154 0
|
监控 Java Linux
系统规则|学习笔记
快速学习系统规则
64 0