生成规则设计

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

/**
 * 生成验证码
 *
 * @param int $length
 * @param string $type 验证码类型 FULL:数字和字母混合
 *
 * @return string
 *
 */
public static function random($length = 6, $type = 'ENGLISH') {
    $result = '';

    $random_type = static::upper($type);
    $rulemap_str = "ABCDEFGHIJKLMNPQRSTUVWXYZ";
    $rulemap_num = "123456789";
    for ($i = 0; $i < $length; $i++) {
        switch ($random_type) {
            case 'ENGLISH':
                $rand = mt_rand(0, (strlen($rulemap_str) - 1));
                $result .= $rulemap_str[$rand];
                break;
            case 'CHINESE':
                $str[$i] = chr(mt_rand(176, 215)) . chr(mt_rand(161, 249));
                $str[$i] = static::charsetEncode($str[$i], "GB2312", "UTF-8"); //imagettftext是utf-8的,所以先转换下
                $result .= $str[$i];
                break;
            case 'NUM':
                $rand = mt_rand(0, (strlen($rulemap_num) - 1));
                $result .= $rulemap_num[$rand];
                break;
            case 'FULL': //NUM+ENGLISH
                $fullstr = $rulemap_str . $rulemap_num;
                $rand = mt_rand(0, (strlen($fullstr) - 1));
                $result .= $fullstr[$rand];
                break;
        }
    }

    return $result;
}

/**
 *  带格式生成不重复的随机字符,支持批量生成
 *  字符格式:# 表示数字 * 表示字母和数字 @表示字母
 * @param  string $format 字符格式: 2017@@@@####*
 * @param  integer $number 生成数量
 * @param  array $except_array 排除的生成字符列表
 * @return string | array
 */
public static function buildFormatRand($format, $number = 1, $except_array = []) {
    $rand_list = array();
    $length = strlen($format);
    for ($j = 0; $j < $number; $j++) {
        $rand_string = '';
        for ($i = 0; $i < $length; $i++) {
            $char = substr($format, $i, 1);
            switch ($char) {
                case "*": //字母和数字混合
                    $rand_string .= self::random(1, 'FULL');
                    break;
                case "#": //数字
                    $rand_string .= self::random(1, "NUM");
                    break;
                case "@": //大写字母
                    $rand_string .= self::random(1, "ENGLISH");
                    break;
                default: //其他格式均不转换
                    $rand_string .= $char;
                    break;
            }
        }
        if (!in_array($rand_string, $rand_list)) {
            if (count($except_array)) {
                if (!in_array($rand_string, $except_array)) {
                    $rand_list[] = $rand_string;
                } else {
                    $j--;
                }
            } else {
                $rand_list[] = $rand_string;
            }
        } else {
            $j--;
        }
    }
    return $number == 1 ? $rand_string : $rand_list;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值