PHP Группирует массив с несколькими измерениями по результатам базы данных
У меня есть массив в результате запроса к базе данных. Линии включают два измерения и некоторые показатели. Показатели должны суммироваться по группам измерений.
Вот пример массива необработанных данных в табличном представлении:
Вот точный массив:
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)
}
}
Вот что я ожидаю получить в качестве вывода:
Каков наилучший способ получить этот результат?
Спасибо.
2 answers
Вы можете просто сделать 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));
Вы упомянули, что этот массив является результатом запроса к базе данных. Таким образом, вы не должны повторять результаты подобным образом, ваше внимание должно быть сосредоточено на том, как вы получаете эти результаты из своей базы данных, поскольку 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 чтобы помочь вам понять это.