my $allusers = [ {
'user' => 'Sarah',
'duration' => 2,
'amount' => 200
},
{
'user' => 'William',
'duration' => 1,
'amount' => 100
},
{
'user' => 'Michael',
'duration' => 3,
'amount' => 300
},
{
'user' => 'Michael',
'duration' => 3,
'amount' => 300
},
{
'user' => 'William',
'duration' => 7,
'amount' => 700
},
{
'user' => 'Sarah',
'duration' => 5,
'amount' => 500
} ];
####
$allusers = [ sort { $a->{'user'} cmp $b->{'user'} } @$allusers ];
my ($temp, $grouped);
my $ctr = -1;
for ( @{ $allusers } ) {
if ( $temp && $temp eq $_->{'user'} ) {
$grouped->[$ctr]{'amount'} += $_->{'amount'};
$grouped->[$ctr]{'duration'} += $_->{'duration'};
} else {
$ctr++;
$temp = $grouped->[$ctr]{'user'} = $_->{'user'};
$grouped->[$ctr]{'amount'} = $_->{'amount'};
$grouped->[$ctr]{'duration'} = $_->{'duration'};
}
}
####
my $allkeys;
for ( @{ $allusers } ) {
my $user = $_->{'user'};
if ( !exists $allkeys->{$user} ) {
my $attributes = { 'amount' => $_->{'amount'},
'duration' => $_->{'duration'}
};
$allkeys->{$user} = $attributes;
} else {
my $refAttributes = $allkeys->{$user};
$refAttributes->{'amount'} += $_->{'amount'};
$refAttributes->{'duration'} += $_->{'duration'};
}
}
my $finalArray;
while ((my $key, my $value) = each %{$allkeys}) {
my $hash = { 'user' => $key,
'amount' => $value->{'amount'},
'duration' => $value->{'duration'}
};
push @{$finalArray}, $hash;
}
####
print Dumper ($finalArray);
$VAR1 = [
{
'amount' => 600,
'user' => 'Michael',
'duration' => 6
},
{
'amount' => 800,
'user' => 'William',
'duration' => 8
},
{
'amount' => 700,
'user' => 'Sarah',
'duration' => 7
}
];