Как вычесть целое число из элементов массива

1

У меня есть массив и целое число в качестве ввода, и я хотел бы последовательно вычитать элементы массива из целого числа, уменьшая соответствующие значения массива до тех пор, пока они не достигнут нуля с принципом " first-in-first-out ".

Я проиллюстрирую свой вопрос примером:

Входные данные:

array: [12, 16, 23]
integer: 25

Ожидаемый результат:

[0, 3, 23]
 ↑  ↑ See here 25 got subtracted

Алгоритм:

  1. 12-25 (Первый элемент массива - целое число): -13, поэтому я помещаю первый элемент массива в 0. И целое число до 13.

  2. 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;
        }
    }
}
  • 2
    Вы можете захотеть опубликовать код, так как люди увидят это как домашнее задание.
  • 0
    У меня нет рабочего кода для этого, пока только пытаюсь решить его, используя циклы с условиями.
Показать ещё 13 комментариев
Теги:
arrays

1 ответ

1
Лучший ответ

Это должно сработать для вас:

Просто зациклируйте свой массив с циклом 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
)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню