生成规则设计

每一个电子商务网站,现在有一种或多种类型的优惠/折扣/优惠券系统,给大家分享一下如何在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. }  

 

 

时间: 2024-10-30 02:31:23

生成规则设计的相关文章

spamassassin自动生成规则的是保存在哪里,以什么样的数据格式保存的?

问题描述 spamassassin自动生成规则的是保存在哪里,以什么样的数据格式保存的? 大神们好,请问有谁研究过spamassassin,它自动生成规则的是保存在哪里,以什么样的数据格式保存的?求教! 解决方案 我悬赏我全部的50分,大神们出来冒冒泡!

不要被C++(自动生成规则)所蒙骗_C 语言

C++对象可以使用两种方式进行创建:构造函数和复制构造函数.假如我们定义了类A,并使用它创建对象. 复制代码 代码如下: A a,b; A c=a; A d(b); 对象a和b使用编译器提供的默认构造函数A::A()创建出来,我们称这种创建方式为对象的定义(包含声明的含义).对象c和d则是使用已有的对象,通过编译器提供的复制构造函数A::A(const A&)创建,我们称这种创建方式为对象的初始化(包含定义和声明的含义). 可能不少人会把对象的初始化和对象的赋值混淆,比如. 复制代码 代码如下:

C#dll版本号默认生成规则

原文:C#dll版本号默认生成规则 1.版本号自动生成方法 只需把 AssemblyInfo.cs文件中的[assembly: AssemblyVersion("1.0.0.0")]改成[assembly: AssemblyVersion("1.0.*")],另外还需要把[assembly: AssemblyFileVersion("1.0.0.0")]注释屏蔽掉.这样再生成的程序集就是自动版本号了. 2.按照这个格式出来的版本号,内部修订版本号

R语言数据挖掘2.5.2 从序列模式中生成规则

2.5.2 从序列模式中生成规则 序列规则.标签序列规则和类序列规则都可以从序列模式中生成,这些可以从前面的序列模式发现算法中得到.

服务器唯一id生成规则

   在使用hashCode的时候,发现会出现相同id,虽然几率很小.虽然发现并不是hashCode的原因,而是其他逻辑的问题. 但是还是试着自己写了一个id生成器,有些id是int的,比如说任务id:有些id是long的,比如说玩家id. 先贴代码来看: private static AtomicInteger id = new AtomicInteger(0); public static long getId() { return (ServerKit.getServerId() & 0x

如何自定义destoon的地址生成规则

在使用destoon的过程中需要对地址规则进行重写,那么如何实现, destoon的列表的地址规则是定义在/api/url.inc.php,然后又是在include/global.func.php中进行的listpages这个函数调用实现 if($page < 1 || $page > $total) $page = 1; $home_url = $MOD['linkurl'].$CAT['linkurl']; $demo_url = $MOD['linkurl'].listurl($CAT,

订单号的设计

生成规则设计 http://hudeyong926.iteye.com/blog/1860360 订单号生成规则 系统时间随即号|系统时间数据库自增号 前阵子,公司有个电子商务项目,需要生成订单号.当时的考虑很简单,取系统时间加上随机数,或者使用 uniqid() 方法.我们都知道,订单号最基本的要求就是唯一,这个条件必须满足.仔细考虑下上述方法,在顾客购买量少的情况下,订单重复的可能性为零,但是在购买高蜂期生成的订单号重复是很有可能发生的 .所以上述方法不可靠,有待强化. Java代码   f

比较全的OA系统功能模块列表

如何判断一款协同OA软件,是否智能,是否注重细节,是否足够成熟呢?产品的设计优势.功能特性,需要我们总结,也需要让更多的用户了解.功能到底强在哪里?下文中将给出一个详尽的答案. 软件安装 傻瓜化向导式安装,自动智能配置,无需专人指导和配置 客户端电脑无需安装任何软件,使用浏览器即可实现全球办公 权限控制 权限管理支持三员管理机制 根据角色控制菜单权限 可按模块根据部门.角色设置管理范围 各模块根据具体情况内置权限,权限控制更加灵活 通过角色排序号,管理范围设置,确保管理层次有序精确 支持设置辅助

Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成

前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能.由于在 09 年最初设计时,ORM 部分的设计并不是最重要的部分,那里 Rafy 的核心是产品线工程.模型驱动开发.界面生成等.所以当时,我们简单地采用了一个开源的小型 ORM 框架:<Lite ORM Library>.这个 ORM 框架可以生成比较简单的 Sql 语句,以处理一般性的情况. 随着不断使用,我们也不断对 ORM 的源码做了不少改动,让它