集装箱号标志注册规则:
一、集装箱编号共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()这个方法即可,返回布尔值