php - 在 PHP 中生成有效的 EAN13

标签 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);
}

最佳答案

如您所说,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/

相关文章:

php super super 全局变量

javascript - 如何停止声音警报?

php - Silverstripe 管理员 : "Has one" dropdown converts to ordinary input field after import

php - 在保存时更新实体而不是在插入时更新实体

php - 网页谷歌地图分享到 whatsapp

php - 是否应该在PHP中使用$ this-> var声明和访问方法属性?

javascript - jQuery ajax 引用网址

php - 从 SHOW COLUMNS mysql 中排除某些列

PHP 不适用于 shell_exec()、system() 或 passthru()

php - Mysql error.sql查询语法错误