尝试在 PHP 中从多个数学公式中计算一个值

Trying to calculate a value from multiple mathematical formulas in PHP

提问人:Gummi 提问时间:6/12/2023 最后编辑:BarmarGummi 更新时间:6/12/2023 访问量:57

问:

我是PHP的新手,您将在下面的代码中看到原因。我正在尝试将字符串转换为仅数字,然后根据其位置将每个数字相乘,然后将所有数字相加为一个变量,最后除以 11。但最终会得到一个太大的价值。

这一切都从获取 17 个字母和数字的字符串开始,这些字母和数字将仅转换为数字:

<?php
    session_start();
    


    if(!isset($_POST['submit']))
    {

        //$_SESSION['count']=0;

    }
    ?>
    <form action="" method="POST">
  <i> VIN-nummer: </i><input type="text" name="fvin">
  <input type="submit" value="Ber&auml;kna" name="submit">
  <br></br>
</form>

<?php
$fvin = $_POST['fvin'];

$l2n = array(
    'A'=>'1',
    'B'=>'2',
    'C'=>'3',
    'D'=>'4',
    'E'=>'5',
    'F'=>'6',
    'G'=>'7',
    'H'=>'8',
    'J'=>'1',
    'K'=>'2',
    'L'=>'3',
    'M'=>'4',
    'N'=>'5',
    'P'=>'7',
    'R'=>'9',
    'S'=>'2',
    'T'=>'3',
    'U'=>'4',
    'V'=>'5',
    'W'=>'6',
    'X'=>'7',
    'Y'=>'8',
    'Z'=>'9'
);

$keys = array_keys($l2n);
$values = array_values($l2n);
$evin = str_replace($keys, $values, $fvin);

我已经回应了结果,到目前为止一切都很好!然后是“破碎”的部分。对于一个数字所在的每个位置,它将乘以一个特定的数字,例如:

  • 位置 0 需要乘以 8
  • 位置 1 需要乘以 7
  • 位置 2 需要乘以 6...
$fvin0 = substr($evin, 0, 0). $fvin0 *=8;
$fvin1 = substr($evin, 1, 1). $fvin1 *=7;
$fvin2 = substr($evin, 2, 2). $fvin2 *=6;
$fvin3 = substr($evin, 3, 3). $fvin3 *=5;
$fvin4 = substr($evin, 4, 4). $fvin4 *=4;
$fvin5 = substr($evin, 5, 5). $fvin5 *=3;
$fvin6 = substr($evin, 6, 6). $fvin6 *=2;
$fvin7 = substr($evin, 7, 7). $fvin7 *=10;
$fvin8 = substr($evin, 8, 8);
$fvin9 = substr($evin, 9, 9). $fvin9 *=9;
$fvin10 = substr($evin, 10, 10). $fvin10 *=8;
$fvin11 = substr($evin, 11, 11). $fvin11 *=7;
$fvin12 = substr($evin, 12, 12). $fvin12 *=6;
$fvin13 = substr($evin, 13, 13). $fvin13 *=5;
$fvin14 = substr($evin, 14, 14). $fvin14 *=4;
$fvin15 = substr($evin, 15, 15). $fvin15 *=3;
$fvin16 = substr($evin, 16, 16). $fvin16 *=2;

除位置 8 外,每个数字都将乘以一个数字。

然后将所有内容相加并除以 11。

$fvin += ($fvin0 + $fvin1 + $fvin2 + $fvin3 + $fvin4 + $fvin5 + $fvin6 + $fvin7 + $fvin8 + $fvin9 + $fvin10 + $fvin11 + $fvin12 + $fvin13 + $fvin14 + $fvin15 + $fvin16)/11;


if(isset($_POST['submit']))
{
    echo $fvin;
    echo "<br>";
    
}

我已经在纸上算了算,我得到的数字太大了。另外,这是我以什么字符串开头的示例:VRZUA5FX29J276031,并且应该以 42,363636...但最终得到 94405436.6363...

我知道我的代码有点乱,但任何帮助都会让我开心!

PHP 数组数学

评论

0赞 CBroe 6/12/2023
请启用正确的PHP错误报告!这应该给你很多“未定义的变量”警告 - 因为你在那里使用了串联运算符,你试图在分配任何值之前将值附加到调用的结果中。$fvin0 = substr($evin, 0, 0). $fvin0 *=8;$fvin0 *=8substr$fvin0
0赞 CBroe 6/12/2023
为什么每次都要增加参数的值?$lengthsubstr
0赞 Gummi 6/12/2023
感谢您@CBroe的反馈!在我的其他较小的项目中,我启用了PHP错误日志,这对我有帮助,我不知道为什么我没有在这里使用它。我想我只是认为我现在足够好了,但是......每$fvin 0,1,2,3...有错误

答:

1赞 Barmar 6/12/2023 #1

不应连接到每个值。由于您尚未为这些变量中的任何一个赋值,因此您将 0 相乘,然后将该 0 附加到 的子字符串中。您应该将子字符串乘以这些乘数。$fvin<num> *= multiplier$fvin$evin

第二个参数是子字符串的长度,而不是子字符串末尾的索引。这些都应该是 1。substr()

$fvin0 = substr($evin, 0, 1) * 8;
$fvin1 = substr($evin, 1, 1) * 7;
$fvin2 = substr($evin, 2, 1) * 6;
$fvin3 = substr($evin, 3, 1) * 5;
$fvin4 = substr($evin, 4, 1) * 4;
$fvin5 = substr($evin, 5, 1) * 3;
$fvin6 = substr($evin, 6, 1) * 2;
$fvin7 = substr($evin, 7, 1) * 10;
$fvin8 = substr($evin, 8, 1);
$fvin9 = substr($evin, 9, 1) * 9;
$fvin10 = substr($evin, 10, 1) * 8;
$fvin11 = substr($evin, 11, 1) * 7;
$fvin12 = substr($evin, 12, 1) * 6;
$fvin13 = substr($evin, 13, 1) * 5;
$fvin14 = substr($evin, 14, 1) * 4;
$fvin15 = substr($evin, 15, 1) * 3;
$fvin16 = substr($evin, 16, 1) * 2;

评论

0赞 Gummi 6/12/2023
谢谢!它现在可以工作了。我想我读得还不够多.我以为这是子字符串的结尾。我对“连接”一无所知,所以这是我必须阅读更多的内容。substr()
0赞 Gummi 6/12/2023
还有一件事......当它是队列中的第一件事时,不会被分配吗?因此,将来我需要确保在尝试对变量执行任何操作之前分配变量。但是在这种情况下,我该怎么做呢?我可以分配然后乘以它吗?$fvin$fvin0 = substr($evin, 0, 1)$fvin0 * 8
0赞 Barmar 6/12/2023
首先计算右边的所有内容,然后分配给变量。=
0赞 Barmar 6/12/2023
是的,你可以用 2 个语句来完成。但为什么要这样做呢?
0赞 Barmar 6/12/2023
运算符用于连接字符串。如果你不知道它做什么,你为什么要写它?.