PHP 计算 - 模数 10 校验位生成
PHP Calculation - Modulus 10 check digit generation
我在弄清楚如何执行此操作时遇到了问题:
- 我得到了一个文件编号
5843
- 从最右边的数字开始,每隔一个数字乘以 2 和 1(例如,
(3x2)+(4x1)+(8x2)+(5x1)
等等)
- 对于每个结果大于 9 的乘法,将它们相加。 (例如,从 (no.2) 的计算我们会得到这个:
(6)+(4)+(16)+(5)
。所以我们得到了一个大于 9 的数字 (16)。我们需要将它们相加 (1+6=7)
。现在输出将是这样的:(6)+(4)+(7)+(5)
.
- 接下来,我们添加它们
(6)+(4)+(7)+(5)=22
- 现在,我们
divide 22 by 10
并在本例中得到余数 2
。
- 最后我们用
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;
}
如果有人想知道如何使用模数或 'getting the rest of a division' (%
):
echo 5 % 3; // outputs 2
(您可以在第一部分之后查看分步输出)
这是注释函数:
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);
输出:
8
$docnum = 1111;
echo func_name($docnum);
输出:
4
$docnum = '-5a84fadsafds.fdar3';
echo func_name($docnum);
输出:
8
$docnum = 4321;
echo func_name($docnum);
输出:
6
此代码输出步骤...
$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>';
输出:
Original Value: -5a84fadsafds.fdar3
Numbers only: 5843
Reversed Value: Array ( [0] => 3 [1] => 4 [2] => 8 [3] => 5 )
After mult.: Array ( [0] => 6 [1] => 4 [2] => 16 [3] => 5 )
Checked for >9: Array ( [0] => 6 [1] => 4 [2] => 7 [3] => 5 )
All values together: 22
Mod: 2
Final result: 8
详细了解代码中使用的内容:
- http://php.net/manual/en/function.array-reverse.php
- http://php.net/manual/en/function.array-map.php
- http://php.net/manual/en/function.array-sum.php
- http://php.net/manual/en/control-structures.foreach.php
- http://php.net/manual/en/language.operators.arithmetic.php(模数)
- http://php.net/manual/en/language.types.type-juggling.php (
(string)
)
正如@Floris ,您可以用模数 9 替换两位数和部分,所以不用
$mp = array_map(function($v){
return ($v > 9) ? $v[0] + $v[1] : $v;
}, $vals);
你会
$mp = array_map(function($v){
return $v % 9;
}, $vals);
并且仍然保持相同的输出...
我在弄清楚如何执行此操作时遇到了问题:
- 我得到了一个文件编号
5843
- 从最右边的数字开始,每隔一个数字乘以 2 和 1(例如,
(3x2)+(4x1)+(8x2)+(5x1)
等等) - 对于每个结果大于 9 的乘法,将它们相加。 (例如,从 (no.2) 的计算我们会得到这个:
(6)+(4)+(16)+(5)
。所以我们得到了一个大于 9 的数字 (16)。我们需要将它们相加(1+6=7)
。现在输出将是这样的:(6)+(4)+(7)+(5)
. - 接下来,我们添加它们
(6)+(4)+(7)+(5)=22
- 现在,我们
divide 22 by 10
并在本例中得到余数2
。 - 最后我们用
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;
}
如果有人想知道如何使用模数或 'getting the rest of a division' (%
):
echo 5 % 3; // outputs 2
(您可以在第一部分之后查看分步输出)
这是注释函数:
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);
输出:
8
$docnum = 1111;
echo func_name($docnum);
输出:
4
$docnum = '-5a84fadsafds.fdar3';
echo func_name($docnum);
输出:
8
$docnum = 4321;
echo func_name($docnum);
输出:
6
此代码输出步骤...
$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>';
输出:
Original Value: -5a84fadsafds.fdar3
Numbers only: 5843
Reversed Value: Array ( [0] => 3 [1] => 4 [2] => 8 [3] => 5 )
After mult.: Array ( [0] => 6 [1] => 4 [2] => 16 [3] => 5 )
Checked for >9: Array ( [0] => 6 [1] => 4 [2] => 7 [3] => 5 )
All values together: 22
Mod: 2
Final result: 8
详细了解代码中使用的内容:
- http://php.net/manual/en/function.array-reverse.php
- http://php.net/manual/en/function.array-map.php
- http://php.net/manual/en/function.array-sum.php
- http://php.net/manual/en/control-structures.foreach.php
- http://php.net/manual/en/language.operators.arithmetic.php(模数)
- http://php.net/manual/en/language.types.type-juggling.php (
(string)
)
正如@Floris
$mp = array_map(function($v){
return ($v > 9) ? $v[0] + $v[1] : $v;
}, $vals);
你会
$mp = array_map(function($v){
return $v % 9;
}, $vals);
并且仍然保持相同的输出...