7

有很多类可以生成条形码图像,但我找不到可以创建有效 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);
}
4

3 回答 3

11

就像你说的,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 的内部代码。前缀、零填充和校验和由函数添加。

于 2013-11-10T13:46:41.843 回答
2

我认为最好将上面的代码更改为以下代码,因为 7 和 70(等等)数字的 EAN 值将是相同的。

$code = '200' . str_pad($number, 9, '0', STR_PAD_LEFT);

谢谢,曼苏尔

于 2016-05-22T16:49:54.713 回答
1

我得到这个答案是因为我正在寻找一个随机的 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 就可以了)完美

于 2020-12-03T08:32:57.043 回答