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

时间:2013-07-01 07:49:21

标签: php mysql

有两个数组

第一个数组

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) - 3133.70(CreditAccount))

现在尝试了解如何执行if(DebitAccount == CreditAccount){from (corresponding DebitAccount SUM(j.Amount)) deduct (corresponding CreditAccount SUM(j.Amount));}

之类的操作

你能建议如何实现目标吗?

2 个答案:

答案 0 :(得分:1)

假设第一个数组为$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.
        }
    }
}
?>

答案 1 :(得分:1)

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

<?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中执行此操作可能会更快,更容易。