PHP计算-模数10校验位生成
我在想怎么做时遇到了一个问题:PHP计算-模数10校验位生成,php,modulus,Php,Modulus,我在想怎么做时遇到了一个问题: 我得到了一个文件编号,例如5843 从最右边的数字开始,每隔一个数字乘以2和1(例如,(3x2)+(4x1)+(8x2)+(5x1)等等) 对于每个结果大于9的乘法,将它们相加。(例如,通过对(2)的计算,我们将得到: (6)+(4)+(16)+(5)。因此我们得到了一个大于9的数字(16)。我们需要添加它们(1+6=7)。现在输出如下:(6)+(4)+(7)+(5) 接下来,我们添加它们(6)+(4)+(7)+(5)=22 现在,我们将22除以10,得到余数,在
5843
(3x2)+(4x1)+(8x2)+(5x1)
等等)(6)+(4)+(16)+(5)
。因此我们得到了一个大于9的数字(16)。我们需要添加它们(1+6=7)
。现在输出如下:(6)+(4)+(7)+(5)
(6)+(4)+(7)+(5)=22
10
减去余数8
你们能告诉我怎么做吗?非常感谢!所以你们只需要一个函数来计算你们的东西吗?我只需要将你们的整数转换成字符串,然后按数字进行计算。所以看起来是这样的:
<?php
$NUMBER = 5843;
echo CalculateThing($NUMBER); // output: 8
function CalculateThing($inputNumber)
{
$output = 0;
$number = (string)$inputNumber;
$mulTwo = true;
for($index=strlen($number)-1; $index>=0; $index--) {
$val = $mulTwo ? intval($number[$index]) * 2 : intval($number[$index]);
if($val>9){
$val = (string)$val;
$val = $val[0]+$val[1];
}
$mulTwo = !$mulTwo;
$output += intval($val);
}
$output = (($output % 10)-10)*-1;
return $output;
}
如果有人想知道如何使用模或“获取除法的其余部分”(%
):
(您可以在第一部分之后查看逐步输出)
这是注释函数:
function func_name($docnum){
// make sure there is just numbers in $docnum
$docnum = preg_replace("/[^0-9]/","",$docnum);
// change order of values to use in foreach
$vals = array_reverse(str_split($docnum));
// multiply every other value by 2
$mult = true;
foreach($vals as $k => $v){
$vals[$k] = $mult ? $v*2: $v;
$vals[$k] = (string)($vals[$k]);
$mult = !$mult;
}
// checks for two digits (>9)
$mp = array_map(function($v){
return ($v > 9) ? $v[0] + $v[1] : $v;
}, $vals);
// adds the values
$sum = array_sum($mp);
//gets the mod
$md = $sum % 10;
// checks how much for 10
$result = 10 - $md;
// returns the value
return $result;
}
一些测试运行:
$docnum = 5843;
echo func_name($docnum);
输出:
八,
输出:
四,
输出:
八,
输出:
六,
此代码输出步骤
$docnum = '-5a84fadsafds.fdar3';
echo 'Original Value: ';
print_r($docnum);
echo '<hr>';
$docnum = preg_replace("/[^0-9]/","",$docnum);
echo 'Numbers only: ';
print_r($docnum);
echo '<hr>';
$vals = array_reverse(str_split($docnum));
echo 'Reversed Value: ';
print_r($vals);
echo '<hr>';
$mult = true;
foreach($vals as $k => $v){
$vals[$k] = $mult ? $v*2: $v;
$vals[$k] = (string)($vals[$k]);
$mult = !$mult;
}
echo 'After mult.: ';
print_r($vals);
echo '<hr>';
$mp = array_map(function($v){
return ($v > 9) ? $v[0] + $v[1] : $v;
}, $vals);
echo 'Checked for >9: ';
print_r($mp);
echo '<hr>';
$sum = array_sum($mp);
echo 'All values together: ';
print_r($sum);
echo '<hr>';
$md = $sum % 10;
echo 'Mod: ';
print_r($md);
echo '<hr>';
$result = 10 - $md;
echo 'Final result: ';
print_r($result);
echo '<hr>';
你会的
$mp = array_map(function($v){
return $v % 9;
}, $vals);
而且仍然保持相同的输出…只是一个注释,这部分:($output%10)-10)*-1;
与10-($output%10)相同;
^^^是的,你是对的。我的智障。写得很快:我投票结束这个问题,因为:哇,我不知道我怎么把评论搞得这么糟。我想说“如果总和大于9,您可以将数字相加或取模9。您可以对所有产品进行模9运算,无论它们是一位还是两位。例如16%9=7和6+1=7@Floris是的,这也是一种可能性。因此,与其使用return($v>9),不如使用$v[0]+$v[1]:$v;
,我们必须返回$v%9;
这正是我的意思yes@FirstOne感谢您完成的工作!如果$md=$sum%10;results zero不应该是函数的结果吗?因为$result=10-$md;将结果转换为10,而不是一个数字
$docnum = '-5a84fadsafds.fdar3';
echo func_name($docnum);
$docnum = 4321;
echo func_name($docnum);
$docnum = '-5a84fadsafds.fdar3';
echo 'Original Value: ';
print_r($docnum);
echo '<hr>';
$docnum = preg_replace("/[^0-9]/","",$docnum);
echo 'Numbers only: ';
print_r($docnum);
echo '<hr>';
$vals = array_reverse(str_split($docnum));
echo 'Reversed Value: ';
print_r($vals);
echo '<hr>';
$mult = true;
foreach($vals as $k => $v){
$vals[$k] = $mult ? $v*2: $v;
$vals[$k] = (string)($vals[$k]);
$mult = !$mult;
}
echo 'After mult.: ';
print_r($vals);
echo '<hr>';
$mp = array_map(function($v){
return ($v > 9) ? $v[0] + $v[1] : $v;
}, $vals);
echo 'Checked for >9: ';
print_r($mp);
echo '<hr>';
$sum = array_sum($mp);
echo 'All values together: ';
print_r($sum);
echo '<hr>';
$md = $sum % 10;
echo 'Mod: ';
print_r($md);
echo '<hr>';
$result = 10 - $md;
echo 'Final result: ';
print_r($result);
echo '<hr>';
$mp = array_map(function($v){
return ($v > 9) ? $v[0] + $v[1] : $v;
}, $vals);
$mp = array_map(function($v){
return $v % 9;
}, $vals);