7

バーコード イメージを生成するクラスはたくさんありますが、有効な EAN13 番号を作成する関数が見つかりません。内部番号は 200 から開始する必要があります ... 指定された値の次の有効な EAN となる有効な EAN13 番号を生成するにはどうすればよいですか?

検証関数は次のようになります。

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 桁の長さですが、他の長さを持つこともできます。EAN13 の希望を指定したので、13 のままにします。

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;
}

$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

有効な radnom EAN を生成するランダム 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;
}

これは UNIX TIMESTAMP を使用するため、一意の EAN を生成します。つまり、毎秒、新しい一意の有効な EAN を生成できます。これは私にとって完璧です(毎秒1つの新しいEANで十分な単純な環境で使用する場合)

于 2020-12-03T08:32:57.043 に答える