校验集装箱号合法性-php版

该博客介绍了集装箱号的注册规则,包括11位编号的组成结构和校验码计算逻辑。提供了一个PHP函数`checkguisn()`用于验证集装箱号的合法性,通过逐位检查字符类型和计算校验码来确定编号是否符合规范。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集装箱号标志注册规则:

一、集装箱编号共11位,前四位是字母,最后一位为校验码
即:1.第一至三位是英文字母
2. 第四位是英文字母”U”
3.第五位至第十一位是数字
4,最后一位数字需要根据以下逻辑计算得出。
字母取数值规则为:A=10,B至K依次取12至21,L至U依次取23至32,V至Z依次取34至38。
二、箱号第一位的值乘以2的0次幂,第二位乘以2的1次幂,...,第十位乘以2的9次幂,然后求和,其和除以11的余数即为校验码的值
public function checkguisn($sn){
        $re=false;
        if ($sn==null||empty($sn)||strlen($sn)!=11) return false;
        $sn=strtoupper($sn);
        $a=substr($sn,0,1);
        $b=substr($sn,1,1);
        $c=substr($sn,2,1);
        $d=substr($sn,3,1);
        $i1=substr($sn,4,1);
        $i2=substr($sn,5,1);
        $i3=substr($sn,6,1);
        $i4=substr($sn,7,1);
        $i5=substr($sn,8,1);
        $i6=substr($sn,9,1);
        $i7=substr($sn,10,1);
        if ("U"!=$d) return false;
        if (!preg_match("/^[A-Z]$/",$a)||!preg_match("/^[A-Z]$/",$b)||!preg_match("/^[A-Z]$/",$c)) return false;

        if (!preg_match("/^[0-9]$/",$i1)||!preg_match("/^[0-9]$/",$i2)
            ||!preg_match("/^[0-9]$/",$i3)||!preg_match("/^[0-9]$/",$i4)
            ||!preg_match("/^[0-9]$/",$i5)||!preg_match("/^[0-9]$/",$i6)
            ||!preg_match("/^[0-9]$/",$i7)) return false;
        if (!$re){
            $sum=$this->getIntFromStr($a)*1+$this->getIntFromStr($b)*2
                +$this->getIntFromStr($c)*2*2+$this->getIntFromStr($d)*2*2*2;
            $sum=$sum+intval($i1)*2*2*2*2
                +intval($i2)*2*2*2*2*2
                +intval($i3)*2*2*2*2*2*2
                +intval($i4)*2*2*2*2*2*2*2
                +intval($i5)*2*2*2*2*2*2*2*2
                +intval($i6)*2*2*2*2*2*2*2*2*2;
            if ($sum%11%10==intval($i7)) $re=true;
        }
        return  $re;
    }
 /**
     * 根据字母获取对应的数值
     * @param $str
     * @return int|string
     */
    private function getIntFromStr($str){
        $base1=['A','B','C','D','E','F','G','H','I','J','K'];
        $base2=['L','M','N','O','P','Q','R','S','T','U'];
        $base3=['V','W','X','Y','Z'];
        foreach ($base1 as $k=>$v){
            if ($str==$v){
                if ($v=='A'){
                    return 10;
                }else{
                    return 11+$k;
                }
            }
        }
        foreach ($base2 as $k=>$v){
            if ($str==$v){
                if ($v=='L'){
                    return 23;
                }else{
                    return 23+$k;
                }
            }
        }
        foreach ($base3 as $k=>$v){
            if ($str==$v){
                if ($v=='V'){
                    return 34;
                }else{
                    return 34+$k;
                }
            }
        }
        return 0;
    }

使用方法:得到的集装箱号调用checkguisn()这个方法即可,返回布尔值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itxiaolong3

打赏可以,但别打我就行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值