我从数据库中得到这个数组值
# amount deduction
[0] 50 10
[1] 300 20
[2] 200 30
我想对这些数组进行递归演绎,直到数据为零,然后如果数组的第一个数量为零(0),则演绎将添加到下一个数据,然后如果第二个数量为零(0),则第一次和第二次演绎将添加到第三个数量,依此类推,直到所有数量都为零(0)。但如果第三个金额为零(0),则应将扣除额添加到第二个扣除额中。
[0] [1] [2]
50 - 10 300 - 20 200 - 30
40 - 10 280 - 20 170 - 30
30 - 10 260 - 20 140 - 30
20 - 10 240 - 20 110 - 30
10 - 10 220 - 20 80 - 30
0 200 - 30 50 - 30
170 - 30 20 - 30
140 - 30 0 - 0
110 - 60
50 - 60
0
这是我的代码
$data = json_decode($debtsData, true);
$continue = true;
while($continue) {
$continue = max(array_column($data, 'amount')) > 0;
for($i=0; $i<count($data); ++$i) {
$totalInterest = $data[$i]['interest_rate'] / 100;
$periods = 12;
$monthly = $data[$i]['monthly'];
$_new_balance = !isset($data[$i]['done']) ? max($data[$i]['amount'], 0) : '';
$interestPayment = ($totalInterest / $periods ) * $_new_balance;
if($data[$i]['amount'] <= 0 && !isset($data[$i]['done'])) {
$data[$i]['done'] = true;
if(isset($data[$i+1])) {
$data[$i+1]['monthly'] += $data[$i]['monthly'];
}
}
echo !isset($data[$i]['done']) ? '$'.number_format(max($data[$i]['amount'], 0),2) : '';
echo !isset($data[$i]['done']) ? '$'.number_format($data[$i]['monthly'],2) : '';
echo !isset($data[$i]['done']) ? '$'.number_format($interestPayment,2).' ' : '';
$data[$i]['amount'] -= $data[$i]['monthly'] - $interestPayment ;
}
}
我的代码的问题是,如果我的第三个金额将结束零(0)比第二个金额,它不会添加到第二个扣除。
- PS:只是不要介意我的代码中的兴趣变量 *
1条答案
按热度按时间7gyucuyw1#
目前还不清楚索引
2
完成时的逻辑是什么-它应该尝试向后1(从索引2
到1
),还是向前直到它达到未完成的值(从索引2
到0
,但索引0
已经完成,因此0
到1
)。无论如何,问题代码中的具体问题是因为它只试图向上索引:
将该逻辑分离到
getNextKey()
函数中可能是有意义的,这样您就可以确定那里的逻辑。类似于:$continue = max(array_column($data, 'amount')) > 0;
应该在for
循环之后,而不是之前。否则,当一切都已经为0时,您将以一个额外的迭代结束。同样不清楚的是,余数在哪一点转移到下一个索引。在这个例子中,在第5步中,index
0
计算为0,所以我认为在该步中,该金额将被添加到index1
的计算中。但在本例中似乎并非如此,因此您需要一个单独的变量来跟踪下一个循环的结转。为了澄清,请看
10 - 10
的步骤。下一步是将10
添加到索引1
的余数中。但是,为什么当索引2
是20 - 30
时,它需要两步才能结转到索引1
的余数呢?不清楚0 - 0
在这里表示什么,因为我希望前面的步骤确定它“完成”。例如,我期望140 - 60
,而不是140 - 30
然后110 - 60
。无论如何,这是我认为基于我上面所做的假设的工作版本:https://3v4l.org/OGU3u
其具有以下计算: