2015-09-21 8 views
5

Mam tablicy w wyniku kwerendy bazy danych. Linie zawierają dwa wymiary i niektóre metryki. Dane muszą być sumowane według grup wymiarów.PHP Grupowanie tablicy z wieloma wymiarami z wyników bazy danych

Oto przykład surowy tablicy danych w widoku tabeli: enter image description here

Oto dokładny tablica:

array(13) { 
    [0]=> 
    array(6) { 
    ["source_name"]=> 
    string(8) "A" 
    ["week"]=> 
    string(2) "10" 
    ["picks"]=> 
    int(1) 
    ["won"]=> 
    int(0) 
    ["lost"]=> 
    int(1) 
    ["draw"]=> 
    int(0) 
    } 
    [1]=> 
    array(6) { 
    ["source_name"]=> 
    string(8) "A" 
    ["week"]=> 
    string(2) "10" 
    ["picks"]=> 
    int(1) 
    ["won"]=> 
    int(1) 
    ["lost"]=> 
    int(0) 
    ["draw"]=> 
    int(0) 
    } 
    [2]=> 
    array(6) { 
    ["source_name"]=> 
    string(8) "A" 
    ["week"]=> 
    string(2) "11" 
    ["picks"]=> 
    int(1) 
    ["won"]=> 
    int(1) 
    ["lost"]=> 
    int(0) 
    ["draw"]=> 
    int(0) 
    } 
    [3]=> 
    array(6) { 
    ["source_name"]=> 
    string(8) "A" 
    ["week"]=> 
    string(2) "11" 
    ["picks"]=> 
    int(1) 
    ["won"]=> 
    int(1) 
    ["lost"]=> 
    int(0) 
    ["draw"]=> 
    int(0) 
    } 
    [4]=> 
    array(6) { 
    ["source_name"]=> 
    string(8) "A" 
    ["week"]=> 
    string(2) "11" 
    ["picks"]=> 
    int(1) 
    ["won"]=> 
    int(0) 
    ["lost"]=> 
    int(1) 
    ["draw"]=> 
    int(0) 
    } 
    [5]=> 
    array(6) { 
    ["source_name"]=> 
    string(8) "A" 
    ["week"]=> 
    string(2) "11" 
    ["picks"]=> 
    int(1) 
    ["won"]=> 
    int(0) 
    ["lost"]=> 
    int(1) 
    ["draw"]=> 
    int(0) 
    } 
    [6]=> 
    array(6) { 
    ["source_name"]=> 
    string(8) "A" 
    ["week"]=> 
    string(2) "11" 
    ["picks"]=> 
    int(1) 
    ["won"]=> 
    int(1) 
    ["lost"]=> 
    int(0) 
    ["draw"]=> 
    int(0) 
    } 
    [7]=> 
    array(6) { 
    ["source_name"]=> 
    string(7) "B" 
    ["week"]=> 
    string(2) "10" 
    ["picks"]=> 
    int(1) 
    ["won"]=> 
    int(0) 
    ["lost"]=> 
    int(1) 
    ["draw"]=> 
    int(0) 
    } 
    [8]=> 
    array(6) { 
    ["source_name"]=> 
    string(7) "B" 
    ["week"]=> 
    string(2) "10" 
    ["picks"]=> 
    int(1) 
    ["won"]=> 
    int(1) 
    ["lost"]=> 
    int(0) 
    ["draw"]=> 
    int(0) 
    } 
    [9]=> 
    array(6) { 
    ["source_name"]=> 
    string(7) "B" 
    ["week"]=> 
    string(2) "11" 
    ["picks"]=> 
    int(1) 
    ["won"]=> 
    int(0) 
    ["lost"]=> 
    int(1) 
    ["draw"]=> 
    int(0) 
    } 
    [10]=> 
    array(6) { 
    ["source_name"]=> 
    string(7) "B" 
    ["week"]=> 
    string(2) "11" 
    ["picks"]=> 
    int(1) 
    ["won"]=> 
    int(1) 
    ["lost"]=> 
    int(0) 
    ["draw"]=> 
    int(0) 
    } 
    [11]=> 
    array(6) { 
    ["source_name"]=> 
    string(9) "C" 
    ["week"]=> 
    string(2) "11" 
    ["picks"]=> 
    int(1) 
    ["won"]=> 
    int(1) 
    ["lost"]=> 
    int(0) 
    ["draw"]=> 
    int(0) 
    } 
    [12]=> 
    array(6) { 
    ["source_name"]=> 
    string(9) "C" 
    ["week"]=> 
    string(2) "11" 
    ["picks"]=> 
    int(1) 
    ["won"]=> 
    int(1) 
    ["lost"]=> 
    int(0) 
    ["draw"]=> 
    int(0) 
    } 
} 

Oto, czego można oczekiwać, aby uzyskać na wyjściu: enter image description here

Jaki jest najlepszy sposób uzyskania tego wyniku?

Dzięki.

+0

Przeprowadź pętlę nad tablicą i zsumuj wartości w nowej tablicy. Nie jest dla mnie jasne, gdzie utknąłeś. – GolezTrol

+0

Czy ta tablica jest wynikiem zapytania do bazy danych? – CodeGodie

+0

@CodeGodie faktycznie nie mogłem dowiedzieć się, jak mogę grupować i sumować bez wielu pętli. I tak, jest to wynik zapytania do bazy danych. – user1488895

Odpowiedz

5

Można po prostu zrobić foreach tu jak w

$result = []; 
foreach($data as $key => $value){ 
    $hash = $value['source_name'] ."_". $value['week']; 

    if(isset($result[$hash])){ 
     $result[$hash]['picks'] += $value['picks']; 
     $result[$hash]['won'] += $value['won']; 
     $result[$hash]['lost'] += $value['lost']; 
     $result[$hash]['draw'] += $value['draw']; 
    }else{ 
     $result[$hash] = $value; 
    } 
} 
print_r(array_values($result)); 
+1

Nie rozumiem, co się dzieje w tej innej gałęzi ... Czy to nie powinno być '$ result [$ hash] = $ value;'? – GolezTrol

+0

OMG! Nie widziałem, że zaktualizowałem swoją odpowiedź @GolezTrol.Dzięki za wskazanie właśnie wysłałem odpowiedź i zamknąłem okno. –

+0

@GolezTrol Nawet myślę, dlaczego to nie zostało odrzucone –

3

Wspomniałeś ta tablica jest wynikiem kwerendy bazy danych. Dlatego nie powinieneś powtarzać wyników w ten sposób, więc powinieneś skupić się na tym, w jaki sposób uzyskujesz te wyniki z bazy danych, ponieważ SQL może zrobić dla ciebie całą tę matematykę z lepszą wydajnością.

ci to pokazać, wyobraź tabela bazy danych o nazwie my_table i ma wszystkie informacje zamieszczone powyżej: (source_name, week, picks, won, lost, draw):

+-------------+------+-------+-----+------+------+ 
| source_name | week | picks | won | lost | draw | 
+-------------+------+-------+-----+------+------+ 
| A   | 10 | 1  | 0 | 1 | 0 | 
+-------------+------+-------+-----+------+------+ 
| A   | 10 | 1  | 1 | 0 | 0 | 
+-------------+------+-------+-----+------+------+ 
| A   | 11 | 1  | 1 | 0 | 0 | 
+-------------+------+-------+-----+------+------+ 
| A   | 11 | 1  | 1 | 0 | 0 | 
+-------------+------+-------+-----+------+------+ 
| A   | 11 | 1  | 0 | 1 | 0 | 
+-------------+------+-------+-----+------+------+ 
| A   | 11 | 1  | 0 | 1 | 0 | 
+-------------+------+-------+-----+------+------+ 
| A   | 11 | 1  | 1 | 0 | 0 | 
+-------------+------+-------+-----+------+------+ 
| B   | 10 | 1  | 0 | 1 | 0 | 
+-------------+------+-------+-----+------+------+ 
| B   | 10 | 1  | 1 | 0 | 0 | 
+-------------+------+-------+-----+------+------+ 
| B   | 11 | 1  | 0 | 1 | 0 | 
+-------------+------+-------+-----+------+------+ 
| B   | 11 | 1  | 1 | 0 | 0 | 
+-------------+------+-------+-----+------+------+ 
| C   | 11 | 1  | 1 | 0 | 0 | 
+-------------+------+-------+-----+------+------+ 
| C   | 11 | 1  | 1 | 0 | 0 | 
+-------------+------+-------+-----+------+------+ 

po uruchomieniu po kwerendach SQL uzyskasz pożądane wyniki bez obawy o iterację lub zapętlenie później.

SELECT source_name, week, sum(picks), sum(won), sum(lost), sum(draw) 
FROM my_table 
GROUP BY source_name, week 
ORDER BY source_name 

WYNIK:

+-------------+------+------------+----------+-----------+-----------+ 
| source_name | week | sum(picks) | sum(won) | sum(lost) | sum(draw) | 
+-------------+------+------------+----------+-----------+-----------+ 
| A   | 10 | 2   | 1  | 1   | 0   | 
+-------------+------+------------+----------+-----------+-----------+ 
| A   | 11 | 5   | 3  | 2   | 0   | 
+-------------+------+------------+----------+-----------+-----------+ 
| B   | 10 | 2   | 1  | 1   | 0   | 
+-------------+------+------------+----------+-----------+-----------+ 
| B   | 11 | 2   | 1  | 1   | 0   | 
+-------------+------+------------+----------+-----------+-----------+ 
| C   | 11 | 2   | 2  | 0   | 0   | 
+-------------+------+------------+----------+-----------+-----------+ 

Sprawdź tę SQL FIDDLE pomóc go zrozumieć.