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