PHP Расчет — модуль 10 генерации контрольных цифр

У меня проблема здесь, выясняя, как это сделать:

  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

Не могли бы вы, ребята, подсказать мне, как это сделать? Большое спасибо !

-4

Решение

В случае, если кто-то задается вопросом, как использовать модуль или «получить остаток от деления» (%):

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] => 3 [1] => 4 [2] => 8 [3] => 5)
После мульт .: Массив ([0] => 6 [1] => 4 [2] => 16 [3] => 5)
Проверено на> 9: Массив ([0] => 6 [1] => 4 [2] => 7 [3] => 5)
Все значения вместе: 22
Мод: 2
Конечный результат: 8


Узнайте больше о вещах, используемых в коде:


Как предложенный @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);

и все равно сохраняйте тот же вывод …

2

Другие решения

Так ты просто хочешь функцию для расчета ваших вещей? Я бы просто преобразовал ваше целое число в строку, а затем сделать ваш расчетный номер по номеру. Так это будет выглядеть так:

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

По вопросам рекламы [email protected]