PHP实现生成唯一会员卡号 数字卡号转换

1.代码实现

<?php
/**
 * Created by PhpStorm.
 * User: aysen
 * Mail: 122195562@qq.com
 * Date: 2020/11/2
 * Time: 10:01
 */
class NumberCardConversion
{
    // 进制数
    private static $dnum = 36;
    // 前缀值
    private static $pre = 'sy';
    // 验长度
    private static $vc_len = 2;
    // 密码字典
    private static $cipherDic = [
        0  =>'0', 1  =>'1', 2  =>'2', 3  =>'3', 4  =>'4', 5  =>'5', 6  =>'6', 7  =>'7', 8  =>'8',
        9  =>'9', 10 =>'A', 11 =>'B', 12 =>'C', 13 =>'D', 14 =>'E', 15 =>'F', 16 =>'G', 17 =>'H',
        18 =>'I', 19 =>'J', 20 =>'K', 21 =>'L', 22 =>'M', 23 =>'N', 24 =>'O', 25 =>'P', 26 =>'Q',
        27 =>'R', 28 =>'S', 29 =>'T', 30 =>'U', 31 =>'V', 32 =>'W', 33 =>'X', 34 =>'Y', 35 =>'Z',
    ];

    /**
     * 数字转换
     * @param int $int 数字
     * @param int $format 格式长度
     * @return string
     */
    public static function encodeID($int, $format = 6) {
        // 初始化值
        $arr = [];
        // 处理状态
        $loop = true;
        // 数据处理
        while ($loop) {
            $arr[] = self::$cipherDic[bcmod($int, self::$dnum)];
            $int = bcdiv($int, self::$dnum, 0);
            if ($int == '0') {
                $loop = false;
            }
        }

        // 长度补位
        if (count($arr) < $format)
        {
            $arr = array_pad($arr, $format, self::$cipherDic[0]);
        }

        // 数据转换
        return implode('', array_reverse($arr));
    }

    /**
     * 卡号转换
     * @param string $card 卡号
     * @return int
     */
    public static function decodeID($card) {
        // 反转数组
        $dedic = array_flip(self::$cipherDic);
        // 去掉补值
        $id = ltrim($card, $dedic[0]);
        // 反转字符
        $id = strrev($id);
        // 初始化值
        $v = 0;
        // 遍历数据
        for ($i = 0, $j = strlen($id); $i < $j; $i++) {
            $v = bcadd(bcmul($dedic[$id {$i}], bcpow(self::$dnum, $i, 0), 0), $v, 0);
        }

        // 数据返回
        return $v;
    }

    /**
     * 数字2卡号
     * @param int $int 数字
     * @param int $format 格式长度
     * @return string
     */
    public static function generateCardByNum($int, $format = 6)
    {
        // 数字转换
        $card = self::encodeID($int, $format);
        // 校验生成
        $card_vc = substr(md5(self::$pre . $card), 0, self::$vc_len);
        // 数据拼接
        return strtolower(self::$pre . $card . $card_vc);
    }

    /**
     * 卡号2数字
     * @param string $card 卡号
     * @return int
     */
    public static function generateNumByCard($card)
    {
        // 前缀长度
        $pre_len = strlen(self::$pre);
        // 卡号长度
        $card_len = strlen($card) - $pre_len - self::$vc_len;
        // 数据截取
        $card = substr($card, $pre_len, $card_len);
        // 转换数据
        return self::decodeID(strtoupper($card));
    }
}

2.代码使用

<?php
/**
 * Created by PhpStorm.
 * User: aysen
 * Mail: 122195562@qq.com
 * Date: 2020/11/2
 * Time: 10:01
 */ 
include_once 'NumberCardConversion.php';
$int = 2584513;

echo '案例数值: ' . $int . "\r\n";
$card = NumberCardConversion::generateCardByNum($int);
echo '数值卡号: ' . $card . "\r\n";
$num  = NumberCardConversion::generateNumByCard($card);
echo '卡号数值: ' . $num . "\r\n";

// 案例数值: 2584513
// 数值卡号: sy01je819d
// 卡号数值: 2584513

 ?>

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值