Как суммировать значения массива по уникальному ключу? - PullRequest
4 голосов
/ 24 марта 2010

Например

array (
product1_quantity => 5,
product1_quantity => 1,
product2_quantity => 3,
product2_quantity => 7,
product3_quantity => 2,
)

с результатом:

product1_quantity - 6, 
product2_quantity - 10, 
product3_quantity - 2

Thanx!


извините, ребята

глупый пример, вместо этого действительно

Array ([0] => Array ([product1] => 7) [1] => Массив ([product1] => 2) [2] => Массив ([product2] => 3) )

Ответы [ 4 ]

3 голосов
/ 24 марта 2010

Одновременно извлекайте элементы по два и добавляйте к хешу.

my @array = (
        product1_quantity => 5,
        product1_quantity => 1,
        product2_quantity => 3,
        product2_quantity => 7,
        product3_quantity => 2,
);
my %sums;
while (@array and my ($k,$v) = (shift(@array),shift(@array)) ) {
        $sums{$k} += $v;
}
2 голосов
/ 24 марта 2010

Вы бы хотели что-то похожее на:

  use Data::Dumper;
  my @input = ( product1_quantity => 5,
                product1_quantity => 1,
                product2_quantity => 3,
                product2_quantity => 7,
                product3_quantity => 2,
              );
  my %output;

  while (my $product = shift(@input) and my $quantity = shift(@input)) {
    $output{$product} += $quantity;
  }

  print Dumper %output;

Это выплевывает:

$VAR1 = 'product2_quantity';
$VAR2 = 10;
$VAR3 = 'product3_quantity';
$VAR4 = 2;
$VAR5 = 'product1_quantity';
$VAR6 = 6;

Будьте осторожны - если у вас есть неопределенные значения в ваших количественных значениях, это сломается. Вы должны иметь четный массив длин пар продуктов / чисел.

0 голосов
/ 24 марта 2010

В Perl:

my %hash = ();
$hash{'product1_quantity'} += 5;
$hash{'product1_quantity'} += 1;
$hash{'product2_quantity'} += 3;
$hash{'product2_quantity'} += 7;
$hash{'product3_quantity'} += 2;

say join ",\n", map { "$_ - $hash{$_}" } keys %hash;

Вывод:

product2_quantity - 10,
product3_quantity - 2,
product1_quantity - 6

Порядок другой, но вы можете заставить его быть "в порядке", добавив сортировку:

say join ",\n", map { "$_ - $hash{$_}" } sort {$a cmp $b} keys %hash;
0 голосов
/ 24 марта 2010
new_array;
foreach p in array:
  if(new_array.contains(p.key))
    new_array[p.key] += p.value;
  else
    new_array[p.key] = p.value;

new_array будет содержать суммы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...