由于数据库查询,我有一个数组。行包括两个维度和一些指标。 度量标准必须按维度组进行求和。
这是确切的数组:
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)
}
}
获得该输出的最佳方法是什么?
感谢。
答案 0 :(得分: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 :(得分:3)
您提到此数组是数据库查询的结果。因此,您不应该像这样迭代结果,您应该关注如何从数据库中获取这些结果,因为SQL可以为您提供更好的性能所需的所有数学。
为了向您展示,假设您的数据库表名为my_table
,并且包含您在上面发布的所有信息:(source_name
,week
,picks
,{{1 }},won
,lost
):
draw
如果您运行以下SQL查询,您将获得所需的结果,而无需担心以后的迭代或循环。
+-------------+------+-------+-----+------+------+
| 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 |
+-------------+------+-------+-----+------+------+
结果:
SELECT source_name, week, sum(picks), sum(won), sum(lost), sum(draw)
FROM my_table
GROUP BY source_name, week
ORDER BY source_name
请查看 SQL FIDDLE ,以帮助您了解它。