背景
产品希望用户在注册的时候自动生成一个 【AB12】形式的邀请码。
思路
1.邀请码是字母加数字组合形式,并且可以看出以自增的方式创建。
2.采用ASCII码的形式处理字母部分('A-Z’的ASCII码为65-90)。
3.采用自左到右自增的方式完成。
简陋的代码
/**
* 2022-06-16 获取一个新的邀请码
* 唯一,且4位,[XX22]形式,可支持6w+账号,溢出为NULL
* @return string|null
*/
public function getNewInvitationCode(): string|null
{
# default
$arr = [
'65',# ASCII 065-090
'65',
'00'# int max 99
];
$release_invitation_code = User::query()->withoutGlobalScope('activeUser')->orderByDesc('invitation_code')->value('invitation_code');
if (!empty($release_invitation_code)) {
preg_match_all('/\w/',$release_invitation_code,$tmp);
$tmp = $tmp[0];
$arr = [
ord($tmp[0]),
ord($tmp[1]),
($tmp[2].$tmp[3])
];
}
$arr_rev = array_reverse($arr);
$next_location_increase = false;
$num = str_pad($arr_rev[0] + 1, 2, 0, STR_PAD_LEFT);
if ($num > 99) {
$num = '00';
$next_location_increase = true;
}else {
$num = str_pad($num,2,0, STR_PAD_LEFT);
}
if ($next_location_increase) {
$c1 = $arr_rev[1] + 1;
$next_location_increase = false;
if ($c1 > 90) {
$next_location_increase = true;
$c1 = 65;
}
} else {
$c1 = $arr_rev[1];
}
if ($next_location_increase) {
$c2 = $arr_rev[2] + 1;
$next_location_increase = false;
if ($c2 > 90) {
goto SET_NULL;
}
} else {
$c2 = $arr_rev[2];
}
$arr = [$c2, $c1, $num];
$invitation_code_rev = [
$num,
chr($c1),
chr($c2),
];
$invitation_code = implode('', array_reverse($invitation_code_rev));
goto SET_CODE;
SET_NULL:
return null;
SET_CODE:
return $invitation_code;
}