PHP使用基于数组元素值的两个数组中的值进行计算


PHP do calculations with values from two arrays based on array element values

有两个数组

第一个阵列

Array
(
[0] => Array
    (
        [SUM(j.Amount)] => 
        [DebitAccount] => 
    )
[1] => Array
    (
        [SUM(j.Amount)] => 15842.88
        [DebitAccount] => 2310
    )
[2] => Array
    (
        [SUM(j.Amount)] => 3656.68
        [DebitAccount] => 2380
    )
[3] => Array
    (
        [SUM(j.Amount)] => 12178.20
        [DebitAccount] => 2610
    )
 )

第二个阵列

Array
(
[0] => Array
    (
        [SUM(j.Amount)] => 
        [CreditAccount] => 
    )
[1] => Array
    (
        [SUM(j.Amount)] => 15842.88
        [CreditAccount] => 2310
    )
[2] => Array
    (
        [SUM(j.Amount)] => 30916.44
        [CreditAccount] => 2380
    )
[3] => Array
    (
        [SUM(j.Amount)] => 3133.70
        [CreditAccount] => 2620
    )
)

目标是什么需要获得这样的输出

账号为2310,价值为0.00(15842.88-15842.88)

账号为2380,价值为-30916.40(3656.68-30916.44)

账号为2610,价值为12178.20(12178.20,DebitAccount)-0.00(CreditAccount))

账号为2620,价值为-3133.70(0.00(DebitAccount)-3137.0(CreditAccount))

现在正试图了解如何做类似if(DebitAccount == CreditAccount){from (corresponding DebitAccount SUM(j.Amount)) deduct (corresponding CreditAccount SUM(j.Amount));} 的事情

你能建议一下如何达到目的吗?

假设第一个数组是$DAs,第二个是$CAs

<?php
foreach($DAs as $i=>$da){
    foreach($CAs as $j=>$ca){
        if($da['DebitAccount'] == $ca['CreditAccount']){
            //output
            echo 'Account number is '.$da['DebitAccount'].', Value is '.$da['SUM(j.Amount)']-$ca['SUM(j.Amount)'].' ('.$da['SUM(j.Amount)'].' - '.$ca['SUM(j.Amount)'].')';
            //deduct the credit
            $DAs[$i]['SUM(j.Amount)'] -= $ca['SUM(j.Amount)'];
            //we need to use $DAs[$i] to be able to modify its value, because foreach can only give a copy of it.
        }
    }
}
?>

处理具有不同成员数的数组需要这样的东西(未测试):-

<?php
usort($DAs, "cmpDA");
usort($CAs, "cmpCA");
$DaAccount = 0;
$CaAccount = 0;
$DaKey = 0;
$CaKey = 0;
while($DaAccount < 999999 OR $CaAccount < 999999)
{
    switch true
    {
        case $DAs[$DaKey]['DebitAccount'] == $CAs[$CaKey]['CreditAccount'] :
            echo "Account number is ".$DAs[$DaKey]['DebitAccount'].", Value is ".($CAs[$CaKey]['SUM(j.Amount)'] - $DAs[$DaKey]['SUM(j.Amount)'])." (".$CAs[$CaKey]['SUM(j.Amount)']." - ".$DAs[$DaKey]['SUM(j.Amount)'].")<br />";
            $DaKey = (($DaKey < count($DAs)) ? $DaKey + 1 : 999999);
            $CaKey = (($CaKey < count($DAs)) ? $CaKey + 1 : 999999);
            break;
        case $DAs[$DaKey]['DebitAccount'] < $CAs[$CaKey]['CreditAccount'] :
            echo "Account number is ".$DAs[$DaKey]['DebitAccount'].", Value is ".(0 - $DAs[$DaKey]['SUM(j.Amount)'])." (0 - ".$DAs[$DaKey]['SUM(j.Amount)'].")<br />";
            $DaKey = (($DaKey < count($DAs)) ? $DaKey + 1 : 999999);
            break;
        case $DAs[$DaKey]['DebitAccount'] > $CAs[$CaKey]['CreditAccount'] :
            echo "Account number is ".$CAs[$CaKey]['CreditAccount'].", Value is ".($CAs[$CaKey]['SUM(j.Amount)'] - 0)." (".$CAs[$CaKey]['SUM(j.Amount)']." - 0)<br />";
            $CaKey = (($CaKey < count($DAs)) ? $CaKey + 1 : 999999);
            break;
    }
}
function cmpDA($a, $b)
{
    return (($a['DebitAccount'] == $b['DebitAccount']) ? 0 : (($a['DebitAccount'] < $b['DebitAccount']) ? -1 : 1) );
}
function cmpCA($a, $b)
{
    return (($a['CreditAccount'] == $b['CreditAccount']) ? 0 : (($a['CreditAccount'] < $b['CreditAccount']) ? -1 : 1) );
}
?>

将2个数组按相同的键顺序排序。执行while循环,而任一数组键都未达到最大值。当关键点匹配时,可以进行计算。当一个比另一个大时,另一个就没有匹配的记录,所以把数组键递增到另一个数组。如果是数组的末尾,则将数组键设置为一些愚蠢而大的值。最终,两个数组都将完成,并且两个键都设置为高值。

然而,如果数据存储在数据库中,那么在SQL中这样做可能会更快、更容易。