У меня есть массив и целое число в качестве ввода, и я хотел бы последовательно вычитать элементы массива из целого числа, уменьшая соответствующие значения массива до тех пор, пока они не достигнут нуля с принципом " first-in-first-out
".
Я проиллюстрирую свой вопрос примером:
Входные данные:
array: [12, 16, 23]
integer: 25
Ожидаемый результат:
[0, 3, 23]
↑ ↑ See here 25 got subtracted
Алгоритм:
12-25
(Первый элемент массива - целое число): -13
, поэтому я помещаю первый элемент массива в 0
. И целое число до 13.
16-13
(второй элемент массива - целое число), в результате 3
, поэтому я поместил второй элемент массива в 3
. И целое число до 0.
(Так как 12+16 = 28 > 25
третий элемент массива оставлен нетронутым)
Какова была бы лучшая стратегия для выполнения этой задачи в PHP?
РЕДАКТИРОВАТЬ:
Мой текущий код/попытка:
public function updateStock(Product $product, $quantity)
{
$j = true;
// $quantity is an integer passed as method parameter
while ($j) {
// $stock is an array of objects, each has a quantity property which must be reducted.
// getActualStocks() method returns stocks with $stock->quantity above zero
$stock = $product->getActualStocks()[0];
$initialQuantity = $stock->quantity;
// this is supposed to update $stock->quantity property
$stock = $stock->update($quantity)
if ($stock->quantity < 0) {
$quantity = $quantity - $initialQuantity;
$stock->quantity = 0;
$stock->save();
} else {
$j = false;
}
}
}
Это должно сработать для вас:
Просто зациклируйте свой массив с циклом for и проверьте каждую итерацию, если вы не находитесь в конце массива. И $input
еще больше, чем 0.
На каждой итерации вы вычисляете $newInput
, просто вычитая текущий элемент массива ($arr[$i]
) из $input
. Если результат больше 0, присвойте результат $newInput
, иначе назначьте 0, а в следующей итерации цикл остановится.
Затем вы делаете то же самое с текущим элементом цикла. Таким образом, если результат отрицательный, вы просто назначаете 0.
В конце каждой итерации просто назначьте $newInput
to $input
.
<?php
$arr = [12, 16, 23];
$input = 25;
$length = count($arr);
for($i = 0; $i < $length && $input > 0; $i++) {
$newInput = $input - $arr[$i] > 0 ? $input - $arr[$i] : 0;
$arr[$i] = $arr[$i] - $input >= 0 ? $arr[$i] - $input : 0;
$input = $newInput;
}
print_r($arr);
?>
вывод:
Array
(
[0] => 0
[1] => 3
[2] => 23
)