php - PHP连续减法两个数组
问题描述
我有 2 个这样的数组
a = Array([101] => 5,[109] =>100,[220] => 50,[231] => 45,[245] => 90)
b = Array(['PRO'] => 12,['LOG'] => 15,['DEV'] => 100)
我想连续减去 2 个数组并得到这样的结果
c = Array([101] => 0,[109] => 0, [220] => 28, [231] => 45, [245] => 90)
说明:我假设使用 foreach 来获取 a 和 b 的值
1st: 5-12=0(move 7 to next time) <=> c[101] => 0;
2nd: 100-7 = 93 (7 at 1st)
3rd : 93-15 = 78
4th: 78-100 = 0 (move 22 to 5th time) <=> c[109] => 0
5th: 50-22 = 28 <=> c[220] => 28
但我不知道如何用PHP表达
解决方案
我会尝试重新表述您的要求,因为在我理解您的需求之前,我必须阅读您的问题大约 10 次。
您希望通过按关联元素出现的顺序$a
使用 in 中的值来减少 in 中的值(使用减法) 。$b
当 in 的值$b
大到足以将 in 的值减小$a
到零或更低时,您希望将该$a
值设置为零并将剩余的值(差)与 in 的下一个值相减$a
。这个携带的价值必须被一个或多个价值消耗,$a
直到它被耗尽。当一个携带值被耗尽时,$b
应该使用下一个出现的值来减少 中的当前值$a
。
12
($b[PRO]
) 用于将5
($a[101]
) 减少到0
(new $a[101]
) 然后7
成为携带值,下一个值$a
将成为新焦点。100
($a[109]
) 首先减少7
(carried
) 并变为93
(new $a[109
)。93
(new [109]
) 再被15
($b[LOG]
) 约简,变成78
(new [109]
)。78
(new [109]
) 然后通过100
($b[DEV]
) 将值降低到0
,生成一个新的进位值22
,并将焦点移到$a[220]
。50
($a[220]
) 被 ( ) 减为(22
) 。carried
28
new $a[220]
- 在这一点上,携带的价值被耗尽并且没有更多的价值
$b
可以减少$a
价值。 $a[231]
并$a[245]
保持不变,因为没有剩余的值可以减去。
我的片段使用教科书算术术语:minuend - suprahend = difference
.
这$difference
是携带的东西。
array_shift()
是合适的,因为它在访问值时会消耗其中的值$b
。
代码:(演示)
$a = [
101 => 5,
109 => 100,
220 => 50,
231 => 45,
245 => 90
];
$b = [
'PRO' => 12,
'LOG' => 15,
'DEV' => 100
];
$difference = 0;
foreach ($a as &$minuend) {
while ($minuend && ($b || $difference < 0)) {
$suprahend = $difference < 0 ? -$difference : array_shift($b);
$difference = $minuend - $suprahend;
$minuend = max(0, $difference);
}
}
var_export($a);
输出:
array (
101 => 0,
109 => 0,
220 => 28,
231 => 45,
245 => 90,
)
推荐阅读
- javascript - JS 按钮仅在第一个元素上触发
- json - 解析带有可解码问题的 JSON
- javascript - firefox 插件:无法使用网络扩展更新选项卡 URL
- html - 如果有一个模式属性,是否还包括必需的属性?
- google-cloud-platform - 使用 cloudsqlproxy 从 GKE 集群连接到 Google 云 mysql 实例
- angular - 使用“dotnet run”命令运行时 Angular/NET Core Web API 未命中
- perl - USPS HTTP 发布请求
- ampl - 下标中的 AMPL 变量尚不允许
- ios - realmdb swift 不从文件中读取值
- c# - 读取 appsettings.json 文件 C# .NET Core 的问题