sub fold { my $self = shift; my $array = $self->{data}; return unless $array && @$array; my %groups = map { $_ => 1 } @{$self->{groups}; my @keys = grep { $groups{$_} } qw/ date campaign /; my %h; foreach my $el ( @$array ){ my $k = join ":", @{$_}{@keys}; # This only works if the date & campaign values do not contain ':' if( exists $h{$k} ) { $h{$k}->{views} += $el->{views}; $h{$k}->{clicks} += $el->{clicks}; }else{ $h{$k} = $el; } } @$array = sort { fold_sort($groups{campaign},$groups{date}) } values %h; }