在PHP中生成有效的EAN13

Fla*_*der 4 php

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

Gol*_*rol 8

就像你说的那样,200(实际上整个200 - 299范围)是一个虚假的国家代码,表明该号码是一个内部号码.这意味着你可以弥补其余的数字.

EAN编号通常为13位数,但也可以有其他长度.让我们保持在13,因为你指定了对EAN13的需求.

第13位是校验位.因此,您所要做的就是执行相同的验证,但要扭曲.您只需计算校验位并将其添加到您已有的12位数,而不是计算校验位并验证最后一位是否与校验位匹配.

我还没有真正尝试修改你现有的代码,因为它看起来令人困惑和复杂,但根据我在维基百科上找到的验证规则,这应该可以解决问题:

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;
}
Run Code Online (Sandbox Code Playgroud)

$number是您想要EANed的内部代码.函数添加前缀,零填充和校验和.