You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现参考编号生成规则的正确PHP代码?

问题分析与修正代码

原代码的核心问题

  1. 发票号补零逻辑错误:手动拼接"{$customerNumber} 0 {$invoiceNumber}"无法适配所有长度的发票号,比如发票号25时,应该生成0025而非直接加单个0。
  2. 校验位权重计算错误:原代码用($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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:31:13