PHP 两个数组连续减法

PHP consecutive subtraction two arrays

我有 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

以下应该有效:

$rest = 0;
foreach ($a as &$value) {
    if ($value < $rest) {
        $rest -= $value;
        $value = 0;
        continue;
    } else {
        $value -= $rest;
        $rest = 0;
    }

    while ($value > 0 && key($b) !== null) {
        if ($value < current($b)) {
            $rest = current($b) - $value;
            $value = 0;
        } else {
            $value -= current($b);
            $rest = 0;
        }
    
        next($b);
    }
}

基本上,这会遍历第一个数组并在每个循环中:

  • 它首先检查是否有上一次迭代的剩余值,并相应地降低该值
  • 接下来,它将从上一次外循环停止的地方开始遍历第二个数组,并降低值直到达到 0 或当第二个数组为 'used up'.[=21 时=]

可在 3v4l.

上找到工作示例

我会尝试重新表述您的要求,因为我必须阅读您的问题大约 10 遍才能理解您的需求。

您想通过按关联元素出现的顺序使用 $b 中的值来减少 $a 中的值(使用减法)。当 $b 中的值大到足以将 $a 中的值减小为零或更低时,您希望将 $a 值设置为零并将剩余值(差)携带到减去 $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 中的值。

代码:(Demo)

$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,
)