Using array_key_exists() you would find repeated values and be able to sum them up. In my case, I am not trying to sum all the values and consolidate them into one value. What I am trying to do is to iterate through the values, group by the ac_no
value and each subsequent encounter of the same ac_no
value, add the new amount
to all previously encountered amounts in the group.
Here’s my sample input:
$array = [
['ac_no' => 100001, 'amount' => 0.00],
['ac_no' => 100001, 'amount' => 51255.11],
['ac_no' => 100001, 'amount' => -500.00],
['ac_no' => 100001, 'amount' => -621.05],
['ac_no' => 100002, 'amount' => .00],
['ac_no' => 100003, 'amount' => .00],
['ac_no' => 100004, 'amount' => 20714.00],
['ac_no' => 100004, 'amount' => 0.00]
];
Notice that ac_no
value 100001
exists 4 times. In the result, the 100001
group should have the following elements because each absolute value is added to all previous amounts in the group:
[
52,376.05, # .00 + 51255.11 + abs(-500.00) + abs(-621.05)
52,376.05, # 51255.11 + abs(-500.00) + abs(-621.05)
1,120.94, # abs(-500.00) + abs(-621.05)
621.05 # abs(-621.05)
]
My current coding attempt looks like this:
foreach ($nameAndCode as $key => $vals) {
if (array_key_exists($vals['ac_no'], $res)) {
$amt = abs($vals['amount']);
$res[$vals['ac_no']]['ac_no'] += $vals['ac_no'];
$res[$vals['ac_no']]['amount'] += $amt;
} else {
$res[$vals['ac_no']] = $vals;
}
}
Advertisement
Answer
Three foreach()
along with array_sum()
and is_array()
will do the job (I am considering negative values to be subtracted):
$acNoWiseArray = [];
//get all amounts as an array ac_no wise
foreach($array as $arr){
$acNoWiseArray[$arr['ac_no']]['sum'][] = $arr['amount'];
}
$finalArray = [];
foreach($acNoWiseArray as $key=>&$value){//calling by reference
foreach($value['sum'] as $k=> $val){
$finalArray[$key]['new_sum'][] = (is_array($value)) ? array_sum($value['sum']) : $value['sum'][$k];
array_shift($value['sum']);
}
}
print_r($finalArray);
Output : https://3v4l.org/duoEc
Important Update: But as I looked at your calculation closely (based on @mickmackusa comment) I found that you are ignoring the -
sign and adding all values as positive. To do so do like below:
$acNoWiseArray = [];
foreach($array as $arr){
$acNoWiseArray[$arr['ac_no']]['sum'][] = $arr['amount'];
}
$finalArray = [];
foreach($acNoWiseArray as $key=>&$value){
foreach($value['sum'] as $k=> $val){
$finalArray[$key]['new_sum'][] = (is_array($value)) ? array_sum(array_map('abs',$value['sum'])) : abs($value['sum'][$k]);
array_shift($value['sum']);
}
}
print_r($finalArray);
Output : https://3v4l.org/j9tkC