2015-09-21 5 views
5

У меня есть массив в результате запроса к базе данных. Линии включают два измерения и некоторые показатели. Метрики должны быть суммированы группами измерений.PHP Группировка массива с несколькими измерениями из результатов базы данных

Вот пример сырой массив данных в виде таблицы: enter image description here

Вот точный массив:

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) 
    } 
} 

Вот что я ожидаю, чтобы получить в качестве вывода: enter image description here

Каков наилучший способ получить этот результат?

Спасибо.

+0

Итак, сверните по массиву и суммируйте значения в новый массив. Мне непонятно, где вы застряли. – GolezTrol

+0

Является ли этот массив результатом запроса к базе данных? – CodeGodie

+0

@CodeGodie на самом деле я не мог понять, как я могу группировать и суммировать без множественного цикла. И, да, это результат запроса к базе данных. – user1488895

ответ

5

Вы можете просто сделать foreach здесь вроде как

$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

Я не понимаю, что происходит в этой ветке else. Не должно быть '$ result [$ hash] = $ value;'? – GolezTrol

+0

OMG! Я не видел, что обновил свой ответ @GolezTrol.Спасибо за указание, что я только что опубликовал ответ и закрыл окно –

+0

@GolezTrol Даже я думаю, почему он не был опущен –

3

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

Чтобы показать это, представьте себе, ваша таблица базы данных называется my_table и имеет всю информацию, которую вы размещены выше: (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 | 
+-------------+------+-------+-----+------+------+ 

Если вы запустите следуя SQL-запросу, вы получите желаемые результаты без необходимости беспокоиться об итерации или повторении цикла позже.

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

РЕЗУЛЬТАТ:

+-------------+------+------------+----------+-----------+-----------+ 
| 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   | 
+-------------+------+------------+----------+-----------+-----------+ 

Заканчивать этот SQL FIDDLE, чтобы помочь вам понять это.

Смежные вопросы