Как суммировать и группировать многомерный массив ключом? - PullRequest
0 голосов
/ 13 мая 2010

У меня есть многомерный массив, и я пытаюсь сгруппировать по значению один из ключей.

Так

 Array (
[0] => Array  (
        [name] => Edward Foo
        [desc_topic] => Array (
                         [0] => Apple
                         [1] => Banana
                         [2] => Orange
                        )            
        [qtd_posts] => Array  (
                         [0] => 10
                         [1] => 20
                         [2] => 50
                        )

    )


[1] => Array  (
        [name] => Michael Max
        [desc_topic] => Array (
                         [0] => Apple
                         [1] => Banana
                         [2] => Orange
                        )  
        [qtd_posts] => Array  (
                         [0] => 10
                         [1] => 10
                         [2] => 10
                        )
    )

[2] => Array  (
        [name] => Edward Foo
        [desc_topic] => Array (
                         [0] => Apple
                         [1] => Banana
                         [2] => Orange
                        )            
        [qtd_posts] => Array  (
                         [0] => 5
                         [1] => 10
                         [2] => 30
                        )

    )

[3] => Array  (
        [name] => Michael Max
        [desc_topic] => Array (
                         [0] => Apple
                         [1] => Banana
                         [2] => Orange
                        )             
        [qtd_posts] => Array  (
                         [0] => 8
                         [1] => 8
                         [2] => 20
                        )

    )            

И мне действительно нужно:

Array (
[0] => Array  (
        [name] => Edward Foo
        [desc_topic] => Array (
                         [0] => Apple
                         [1] => Banana
                         [2] => Orange
                        )            
        [qtd_posts] => Array  (
                         [0] => 15
                         [1] => 30
                         [2] => 80
                        )

    )

[1] => Array  (
        [name] => Michael Max
        [desc_topic] => Array (
                         [0] => Apple
                         [1] => Banana
                         [2] => Orange
                        )  
        [qtd_posts] => Array  (
                         [0] => 18
                         [1] => 18
                         [2] => 30
                        )

           )

  )

1 Ответ

1 голос
/ 13 мая 2010

Я предполагаю следующее:

  1. каждая запись имени в исходном массиве имеет идентичный подмассив desc_topic (например, все они имеют одинаковые значения Apple / Banana / Orange для каждого экземпляра.
  2. подмассив qtd_posts имеет сгруппированные значения в одинаковых соответствующих слотах (например, все записи «1» должны суммироваться вместе, все записи «2» суммируются вместе и т. Д.) 1008 *
  3. Вы хотите сохранить ключи родительского массива, чтобы все записи «Edward Foo» использовали первый ключ, используемый записью Edward Foo (например, 0)

Если это применимо, то что-то вроде этого должно работать:

$newarr = array();
$reverse_map = array();

foreach($array as $idx => $entry) {
    if (isset($reverse_map[$entry['name']]) {
         // have we seen this name before? retrieve its original index value
         $idx = $reverse_map[$entry['name']]; 
    } else {
         // nope, new name, so store its index value
         $reverse_map[$entry['name']] = $idx;
    }

    // copy the 'constant' values
    $newarr[$idx]['name'] = $entry['name'];
    $newarr[$idx]['desc_top'] = $entry['desc_topic'];

    // sum the qtd_post values to whatever we previously stored.        
    foreach($entry['qtd_posts'] as $x => $y) {
        $newarr[$idx]['qtd_posts'][$x] += $y;
    }
}
...