如何实现参考编号生成规则的正确PHP代码?
问题分析与修正代码
原代码的核心问题
- 发票号补零逻辑错误:手动拼接
"{$customerNumber} 0 {$invoiceNumber}"无法适配所有长度的发票号,比如发票号25时,应该生成0025而非直接加单个0。 - 校验位权重计算错误:原代码用
($sum % 2) +1生成权重,完全不符合「从右到左用7、3、1循环」的规则,导致求和结果偏差。
正确实现代码
<?php $customerNumber = 1; $invoiceNumber = 765; // 可替换为任意用户输入的发票号 // 1. 将发票号左侧补零至4位 $paddedInvoice = str_pad((string)$invoiceNumber, 4, '0', STR_PAD_LEFT); // 2. 生成基础参考编号 $baseReference = $customerNumber . $paddedInvoice; // 3. 准备校验位计算:反转基础编号,把从右到左遍历转为从左到右遍历反转后的数组 $reversedDigits = str_split(strrev($baseReference)); $weights = [7, 3, 1]; $sum = 0; foreach ($reversedDigits as $index => $digit) { // 循环取7、3、1权重:索引对3取模实现循环 $weight = $weights[$index % 3]; $sum += (int)$digit * $weight; } // 4. 计算校验位:下一个整十数减求和结果,结果为10则取0 $remainder = $sum % 10; $checkDigit = $remainder === 0 ? 0 : 10 - $remainder; // 5. 生成最终参考编号 $finalReference = $baseReference . $checkDigit; echo "Final Reference Number: {$finalReference}"; ?>
测试验证
- 当发票号为
25时,输出:Final Reference Number: 100256(与示例一致) - 当发票号为
765时,输出:Final Reference Number: 107657(符合预期结果)
内容的提问来源于stack exchange,提问作者Janne
相关产品推荐
相关产品推荐

