验证EAN13条码
EAN13条形码在欧洲通常用于标记产品。如果您想进一步了解它们的工作原理,请查看有关欧洲商品编号的Wikipedia条目。
EAN13条形码实际上是12位数字长,并通过使用位于末尾的校验位进行验证,从而使代码长13位。校验位通过以下过程算出:
将所有偶数相加,然后将此数字乘以3。
将所有奇数相加,然后将此结果加到偶数的结果中。
将数字除以10,其余部分(取模)。
如果余数不为0,则从该数字中减去10。
这是完成这些步骤的功能,但同时还要检查条形码的长度。如果它是13位长,则它既返回原始校验位,又返回计算出的校验位。如果条形码长度为12位,则它将返回校验和。在这两种情况下,原始条形码也会被返回。
function validateEan13($digits) { $originalcheck = false; if ( strlen($digits) == 13 ) { $originalcheck = substr($digits, -1); $digits = substr($digits, 0, -1); } elseif ( strlen($digits) != 12 ) { //无效的EAN13条码 return false; } //将偶数加在一起 $even = $digits[1] + $digits[3] + $digits[5] + $digits[7] + $digits[9] + $digits[11]; //将此结果乘以3 $even = $even * 3; //将奇数加在一起 $odd = $digits[0] + $digits[2] + $digits[4] + $digits[6] + $digits[8] + $digits[10]; //将两个总数相加 $total = $even + $odd; //计算校验和 //将总数除以10,然后存储剩余的数 $checksum = $total % 10; //如果结果不为0,则取走10 if($checksum != 0){ $checksum = 10 - $checksum; } //返回结果。 if ( $originalcheck !== false ) { return array('barcode'=>$digits, 'checksum'=>$checksum, 'originalcheck'=>$originalcheck); } else { return array('barcode'=>$digits, 'checksum'=>$checksum); } }
为了测试这一点,我通过该函数运行了一些代码。
//两个普通条形码 print_r(validateEan13(5023920187205)); print_r(validateEan13(5010548001860)); //一个简短的条形码来计算校验和 print_r(validateEan13(501054800186)); //普通条形码 print_r(validateEan13(5034504935778)); //相同的条形码带有破损的数字 print_r(validateEan13(5034504735778)); //两个随机数,其中一个长度不足以成为EA13条形码 print_r(validateEan13(7233897438712)); var_dump(validateEan13(3345345345));
这将打印出以下结果,为方便起见,我已对其进行了注释。
//两个普通条形码 Array ( [barcode] => 502392018720 [checksum] => 5 [originalcheck] => 5 ) Array ( [barcode] => 501054800186 [checksum] => 0 [originalcheck] => 0 ) //一个简短的条形码来计算校验和 Array ( [barcode] => 501054800186 [checksum] => 0 ) //普通条形码 Array ( [barcode] => 503450493577 [checksum] => 8 [originalcheck] => 8 ) //相同的条形码带有破损的数字 Array ( [barcode] => 503450473577 [checksum] => 4 [originalcheck] => 8 ) //两个随机数,其中一个长度不足以成为EA13条形码 Array ( [barcode] => 723389743871 [checksum] => 4 [originalcheck] => 2 ) bool(false)