首页 > 解决方案 > 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表达

标签: phparraysdiffsubtractioncontinue

解决方案


我会尝试重新表述您的要求,因为在我理解您的需求之前,我必须阅读您的问题大约 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) 。carried28new $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,
)

推荐阅读