有很多类可以生成条形码图像,但我找不到可以创建有效EAN13编号的函数。内部数字应以200开头...如何生成一个有效的EAN13号码,该号码是下一个有效的EAN到给定值?
验证功能如下所示:
function ean13_check($digits){
if($digits <= 0) return 0;
while(strlen($digits) < 13){
$digits = '0'.$digits;
}
$digits=preg_split("//",$digits,-1,PREG_SPLIT_NO_EMPTY);
$a=$b=0;
for($i=0;$i<6;$i++){
$a+=(int)array_shift($digits);
$b+=(int)array_shift($digits);
}
$total=($a*1)+($b*3);
$nextten=ceil($total/10)*10;
return $nextten-$total==array_shift($digits);
}
答案 0 :(得分:6)
就像你说的那样,200(实际上整个200 - 299范围)是一个虚假的国家代码,表明该号码是一个内部号码。这意味着你可以弥补其余的数字。
EAN编号通常为13位数,但也可以有其他长度。让我们保持在13,因为你指定了对EAN13的需求。
第13位是校验位。因此,您所要做的就是执行相同的验证,但要扭曲。您只需计算校验位并将其添加到您已有的12位数字,而不是计算校验位并验证最后一位是否与校验位匹配。
我还没有真正尝试修改现有代码,因为它看起来令人困惑和复杂,但根据我在Wikipedia上找到的验证规则,这应该可以解决问题:
function generateEAN($number)
{
$code = '200' . str_pad($number, 9, '0');
$weightflag = true;
$sum = 0;
// Weight for a digit in the checksum is 3, 1, 3.. starting from the last digit.
// loop backwards to make the loop length-agnostic. The same basic functionality
// will work for codes of different lengths.
for ($i = strlen($code) - 1; $i >= 0; $i--)
{
$sum += (int)$code[$i] * ($weightflag?3:1);
$weightflag = !$weightflag;
}
$code .= (10 - ($sum % 10)) % 10;
return $code;
}
$number
是您希望获得EAN的内部代码。函数添加了前缀,零填充和校验和。
答案 1 :(得分:1)
我认为最好将上面的代码更改为以下代码,因为7和70(等等)数字的EAN值将相同。
$code = '200' . str_pad($number, 9, '0', STR_PAD_LEFT);
谢谢,曼苏尔
答案 2 :(得分:0)
我之所以得出这个答案,是因为我正在寻找一个随机的EAN生成器,它可以生成有效的radnom EAN。根据GolezTrol的答案,我做到了。也许可以帮助某人:
function generateEAN()
{
$date = new DateTime();
$time = $date->getTimestamp();
$code = '20' . str_pad($time, 10, '0');
$weightflag = true;
$sum = 0;
for ($i = strlen($code) - 1; $i >= 0; $i--) {
$sum += (int)$code[$i] * ($weightflag ? 3 : 1);
$weightflag = !$weightflag;
}
$code .= (10 - ($sum % 10)) % 10;
return $code;
}
这将生成一个唯一的EAN,因为它使用UNIX TIMESTAMP。因此:每秒钟都可以生成一个新的,唯一的,有效的EAN。这对我来说很完美(用于简单的环境中,每秒可以使用一个新的EAN)