有两个数组
第一个阵列
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中这样做可能会更快、更容易。