提问人:Gummi 提问时间:6/12/2023 最后编辑:BarmarGummi 更新时间:6/12/2023 访问量:57
尝试在 PHP 中从多个数学公式中计算一个值
Trying to calculate a value from multiple mathematical formulas in PHP
问:
我是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ä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...
我知道我的代码有点乱,但任何帮助都会让我开心!
答:
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
运算符用于连接字符串。如果你不知道它做什么,你为什么要写它?.
评论
$fvin0 = substr($evin, 0, 0). $fvin0 *=8;
$fvin0 *=8
substr
$fvin0
$length
substr