有很多生成条形码图像的类,但我找不到可以创建有效 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);
}
最佳答案
如您所说,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
是您想要 EANed 的内部代码。前缀、零填充和校验和由函数添加。
关于php - 在 PHP 中生成有效的 EAN13,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19890144/