我找到了一个解决方案,请参阅下面的答案和/或Github Gist,它有更新的优化。
我有一系列信用卡费用和批次总额...有时金额的 SUM() = 批次金额,所以这很容易分组到批次,我们可以检查促成当天存款的交易支票账户。
有时,适当的总和是这些费用的一个子集,其中 1 个或多个在第二天分批。你能帮我以编程方式解决这个问题吗?这是为了我的 authorize.net 批量会计,这很糟糕,所以我正在为我的簿记员制作一个工具。
+------------+--------+
| transId | amount |
+------------+--------+
| 2863996511 | 154.00 |
| 2863992361 | 762.20 |
| 2863898975 | 49.00 |
| 2863894564 | 5.44 |
| 2863879671 | 10.88 |
| 2863858891 | 209.00 |
| 2863856334 | 148.00 |
| 2863367273 | -25.01 |
+------------+--------+
当天的批次总额为 1302.63 美元。正如经常发生的那样,该批次中没有电荷,因此该批次是阵列中电荷总和的某个子集。在这种情况下,10.88 美元的费用在第二天的批次中。这段伪代码可以通过两个嵌套的 for 循环来捕获:
for( $skipdx=0; $skipdx<$size; $skipdx++){
$total=0;
for( $idx=0; $idx<$size; $idx++){
if($idx!=$skipdx){
$total+=$charges[$idx]['amount'];
$thisBatch[]=$charges[$idx]['transId'];
}
if( abs($total-$batch['total']) < .04 ) {
echo "sum of charges matches $date batch total: $$total (line: ". __LINE__ .")\n";
$foundIt=TRUE;
break;
}
}
if($foundIt==TRUE)
break;
}
如何动态选择搜索未添加两个的费用?然后三个?我可以看到,如果$skipdx
省略了一项费用,那么跳过两项费用将添加一个skip2dx
嵌套循环。如果仍未找到,skip3dx
将是第 3 级嵌套。
在递归之前,我通常非常擅长算法,然后我变得愚蠢。