PHP字符串整形数字相加
php字符串数字相加
int 类型有最大值限制,使用 string 来做数值相加,理论上不会出现数据溢出。
思路
把字符串转换成数组,然后反转,如把 [1,2],变成[2, 1],循环计算的时候就能从【个位】开始计算。 因为 12 + 1,是先算 2 + 1,而不是 1 + 1;
个位 + 个位 最终产生的结果最大也不过是 十位,最小还是个位,也就是 9 + 9 = 18, 1 + 1 = 2;
用一个数组来保存计算出来的值,把计算出来的个位存储数组头部,十位 保留到下次计算,也就是 19 + 2, 把 9 + 2 = 11 的 个位 存储数组 即 [1], 然后十位 在与 19 的十位相加 1 + 1 = 2,添加到数组头部 即 [2,1], 最后转换为 字符串 21.
代码实现
/**
* 数值字符串相加
* @param string $numOne 第一个数
* @param string $numTwo 第二个数
* @return string
*/
public function numStrAdd(string $numOne, string $numTwo): string
{
$numOneArr = array_reverse((array)$numOne);
$numTwoArr = array_reverse((array)$numTwo);
if (count($numOneArr) < count($numTwoArr)) {
$tempArr = $numOneArr;
$numOneArr = $numTwoArr;
$numTwoArr = $tempArr;
unset($tempArr);
}
$newNumArr = [];
$tempNum = 0;
foreach ($numOneArr as $k => $v) {
$needSumNumber = $numTwoArr[$k] ?? 0;
$v += $needSumNumber;
$v += $tempNum;
$tempNum = 0;
$v = (array)(string)$v;
$needUnSiftNum = 0;
if (count($v) > 1) {
$tempNum = $v[0];
$needUnSiftNum = $v[1];
} else {
$needUnSiftNum = $v[0];
}
array_unshift($newNumArr, $needUnSiftNum);
}
if ($tempNum > 0) {
array_unshift($newNumArr, $tempNum);
}
return implode('',$newNumArr);
}
本作品采用《CC 协议》,转载必须注明作者和本文链接