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
  • 从最右边的数字开始,每隔一个数字乘以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,得到余数,在本例中为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;
    }
    

    如果有人想知道如何使用模或“获取除法的其余部分”(
    %
    ):


    (您可以在第一部分之后查看逐步输出)

    这是注释函数:

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