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