Указатель условной суммы массива - PullRequest
0 голосов
/ 17 июня 2020

У меня вопрос, как сделать итерацию. Я хочу разместить итоговую строку после каждого элемента в массиве, если следующий элемент в массиве соответствует определенному условию c. Условия Spesifi c имеют logi c как это

данные как это

enter image description here

, если я запрашиваю количество, например = 60 результат, надеюсь, вот так

вы можете увидеть

data[2] = 01/03/2020 просто взял 10 из 40

enter image description here

$iter = new \ArrayIterator($values);
$sum = 0;
foreach($values as $key => $value) {
    $nextValue = $iter->current();
    $iter->next(); 
    $nextKey = $iter->key();
    if(condition) {
       $sum += $value;
    }
}
dd($iter);

enter image description here

как заставить этот logi c работать на php языке / laravel?

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

Следующие logi c могут помочь вам на вашем пути:

<code><?php
$stock = [
    '01/01/2020' => 20,
    '01/02/2020' => 30,
    '01/03/2020' => 40
];

showStatus($stock, 'in stock - before transaction');

$demand = 60;

foreach ($stock as $key => $value) {
    if ($value <= $demand) {
        $stock[$key] = 0;
        $supplied[$key] = $value;
        $demand -= $value;
    } else {
        $stock[$key] -= $demand;
        $supplied[$key] = $value - ($value - $demand);
        $demand = 0;
    }
}

showStatus($supplied, 'supplied');
showStatus($stock, 'in stock - after transaction');


function showStatus($arr = [], $msg = '')
{
    echo $msg;
    echo '<pre>';
    print_r($arr);
    echo '
'; }?> ** Вывод: ** в наличии - перед транзакцией Массив ([01.01.2020] => 20 [01.02.2020] => 30 [01.03.2020] => 40) предоставленный массив ( [01.01.2020] => 20 [01.02.2020] => 30 [01.03.2020] => 10) в наличии - после транзакции Массив ([01.01.2020] => 0 [01 / 02/2020] => 0 [01.03.2020] => 30)

Работает демо

1 голос
/ 17 июня 2020

Я не уверен, что правильно вас понял, но это может помочь:

$values = [
    '01/01/2020' => 20,
    '01/02/2020' => 30,
    '01/03/2020' => 40
];

$demand = 60;
$total  = array_sum($values);
$decrease = $total - $demand; //(20+30+40) - 60 = 30
$last_key = array_keys($values,end($values))[0]; //Is 01/03/2020 in this case
$values[$last_key] -= $decrease; //Decrease value with 30 calulated above

Будет выведено:

Array
(
    [01/01/2020] => 20
    [01/02/2020] => 30
    [01/03/2020] => 10
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...