PHP计算 - 模数10校验位生成

时间:2016-03-12 03:46:46

标签: php modulus

我在这里弄明白如何做到这一点:

  1. 我的文件号为5843
  2. 从最右边的数字开始,将每隔一个数字乘以2和1(例如,(3x2)+(4x1)+(8x2)+(5x1)等等)
  3. 对于产生超过9的数字的每个乘法,添加它们的数字。 (例如,从(2号)的计算中我们得到这个: (6)+(4)+(16)+(5)。所以我们得到一个数字(16),它超过9.我们需要添加它们(1+6=7)。现在输出将是这样的:(6)+(4)+(7)+(5)
  4. 接下来,我们添加(6)+(4)+(7)+(5)=22
  5. 现在,我们divide 22 by 10并在这种情况下得到2的剩余部分。
  6. 最后我们用10减去余数。
  7. 所以最后一个输出将是8
  8. 你们可以指导我如何做到这一点吗?非常感谢你!

2 个答案:

答案 0 :(得分:2)

如果有人得到了一个问题,想知道如何使用模数或者让其他人进行分工。 (%):

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>';

输出:

  

原值:-5a84fadsafds.fdar3
  仅限数字:5843
  反转值:数组([0] =&gt; 3 [1] =&gt; 4 [2] =&gt; 8 [3] =&gt; 5)
  在mult。:Array([0] =&gt; 6 [1] =&gt; 4 [2] =&gt; 16 [3] =&gt; 5)
  检查&gt; 9:数组([0] =&gt; 6 [1] =&gt; 4 [2] =&gt; 7 [3] =&gt; 5)
  所有价值在一起:22
  Mod:2
  最终结果:8

详细了解代码中使用的内容:

@Floris的suggested,您可以用模数9替换两位数的和部分,而不是

$mp = array_map(function($v){
        return ($v > 9) ? $v[0] + $v[1] : $v;
    }, $vals);

你会有

$mp = array_map(function($v){
        return $v % 9;
    }, $vals);

仍然保持相同的输出...

答案 1 :(得分:0)

所以你只想要一个函数来计算你的东西?我只是将您的整数转换为字符串,然后按数字计算您的计算数字。所以它看起来像这样:

<?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;
}