如何使用 PHP 根据 Key 对数组的值求和
How to sum values of array based on Key using PHP
for ($row = 0; $row < 25; $row++) {
$bQuery = 'Select date, billed from {$tableArray[$row][1]}';
$bProvider = new CSqlDataProvider($bQuery, array('pagination'=>false));
$Arr2 = $bProvider->getData();
// merging array to get all loop records in single array
$array_2 = array_merge($array_2, $Arr2);
}
然后print_r$array_2
输出为:
Array
(
[0] => Array
(
[date] => 2016-11-00
[billed] => 100
)
[1] => Array
(
[date] => 2016-12-00
[billed] => 400
)
[2] => Array
(
[date] => 2016-11-00
[billed] => 200
)
// so on
)
我想在 date is same
中求和 billed
。所以这是适用于它的我的代码。
$result = array();
foreach ($array_2 as $data) {
@$result[$data['date']] += $data['billed'];
}
print_r($result);
$newresultGraph = array();
foreach ($result as $date => $billed) {
$newresultGraph[] = array('date' => $date, 'billed' => $billed);
}
print_r($newresultGraph);
上面代码中的print_r($result)
returns我的数据如下,它已经对同一日期的值求和了。
Array
(
[2016-11-00] => 300
[2016-12-00] => 400
)
然后在我上面的代码中,在另一个 foreach 循环之后,我像以前一样在数组中制作我的数据。当我print_r($newresultGraph)
,我的数据是这样的
Array
(
[0] => Array
(
[date] => 2016-11-00
[billed] => 300
)
[1] => Array
(
[date] => 2016-12-00
[billed] => 400
)
)
这对我来说非常有用..因为我的查询是这样的。
Select date, billed from table'
我只从 table 得到 date
, billed
但现在我有另一个字段所以我的查询是这样的..
Select
date,
billed,
((billed * rate) * (myValue) / 100) as my_rev,
((billed * rate) * (opValue) / 100) as op_rev,
From table
所以我有两个新值,它们是 my_rev
和 op_rev
然后print_r$array_2
输出为:
Array
(
[0] => Array
(
[date] => 2016-11-00
[billed] => 100
[my_rev] => 30
[op_rev] => 70
)
[1] => Array
(
[date] => 2016-12-00
[billed] => 400
[my_rev] => 150
[op_rev] => 250
)
[2] => Array
(
[date] => 2016-11-00
[billed] => 200
[my_rev] => 50
[op_rev] => 150
)
// so on
)
这是正确的,
我想对一个日期的所有账单的价值求和,my_rev,op_rev。我不想对账单+my_rev+op_rev求和..
我希望我的数组如下所示:它应该将 billed 的所有值加到 billed 中,类似于 my_rev 和 op_rev。
就像下面的例子。
Array
(
[0] => Array
(
[date] => 2016-11-00
[billed] => 300
[my_rev] => 80
[op_rev] => 220
)
[1] => Array
(
[date] => 2016-12-00
[billed] => 400
[my_rev] => 150
[op_rev] => 250
)
)
我上面的代码将我的 print_r($result)
变成这样:
Array
(
[2016-11-00] => 600
[2016-12-00] => 800
)
我该怎么办?还有其他建议吗?
这段代码可以做到:
$tmp_array = array();
foreach ($array as $val) {
if (array_key_exists($val['date'], $tmp_array)) {
$tmp_array[$val['date']]['billed'] += $val['billed'];
$tmp_array[$val['date']]['my_rev'] += $val['my_rev'];
$tmp_array[$val['date']]['op_rev'] += $val['op_rev'];
} else {
$tmp_array[$val['date']]['date'] = $val['date'];
$tmp_array[$val['date']]['billed'] = $val['billed'];
$tmp_array[$val['date']]['my_rev'] = $val['my_rev'];
$tmp_array[$val['date']]['op_rev'] = $val['op_rev'];
}
}
$result = array_values($tmp_array);
输出:
Array
(
[0] => Array
(
[date] => 2016-11-00
[billed] => 300
[my_rev] => 80
[op_rev] => 220
)
[1] => Array
(
[date] => 2016-12-00
[billed] => 400
[my_rev] => 150
[op_rev] => 250
)
)
)
$tmp_array
以日期为键对数据进行分组,最后用连续的索引替换这些键。如果您更喜欢将日期保留为键 - 它更优化 - 或者不在乎,只需调用 $tmp_array
$result
并删除最后一行。
只需像这样更改您的倒数第二个 foreach,然后打印结果数组,您会看到它会将值与它们的键相加。
$result = array();
foreach ($array_2 as $data) {
@$result[$data['date']]['billed'] += $data['billed'];
@$result[$data['date']]['my_rev'] += $data['my_rev'];
@$result[$data['date']]['op_rev'] += $data['op_rev'];
}
如果需要,您可以相应地更改最后一个 foreach。
使用您的值的结果:
输入:
Array
(
[0] => Array
(
[date] => 2016-11-00
[billed] => 100
[my_rev] => 30
[op_rev] => 70
)
[1] => Array
(
[date] => 2016-12-00
[billed] => 400
[my_rev] => 150
[op_rev] => 250
)
[2] => Array
(
[date] => 2016-11-00
[billed] => 200
[my_rev] => 50
[op_rev] => 150
)
)
结果:
Array
(
[2016-11-00] => Array
(
[billed] => 300
[my_rev] => 80
[op_rev] => 220
)
[2016-12-00] => Array
(
[billed] => 400
[my_rev] => 150
[op_rev] => 250
)
)
有两种选择:
- 计算 PHP
中的总和
- 计算 SQL
中的总和
计算 PHP
中的总和
$sql = <<<SQL
SELECT
date,
billed,
billed * rate * myValue / 100 AS my_rev,
billed * rate * opValue / 100 AS op_rev
FROM
table
SQL;
$provider = new CSqlDataProvider($sql, array(
'pagination' => false,
));
$rows = $provider->getData();
$data = array();
foreach ($rows as $row) {
$date = $row['date'];
// initialize
if (!array_key_exists($date, $data)) {
$data[$date] = array(
'date' => $date,
'billed' => $row['billed',
'my_rev' => $row['my_rev'],
'op_rev' => $row['op_rev',
);
continue;
}
$data[$date]['billed'] += $row['billed'];
$data[$date]['my_rev'] += $row['my_rev'];
$data[$date]['op_rev'] += $row['op_rev'];
}
// sort by key, that is, sort by date
ksort($data);
// remove keys
$data = array_values($data);
var_dump($data);
计算总和 SQL
$sql = <<<SQL
SELECT
date,
SUM(billed),
SUM(billed * rate * myValue / 100) AS my_rev,
SUM(billed * rate * opValue / 100) AS op_rev
FROM
table
GROUP BY
date
ORDER BY
date ASC
SQL;
$provider = new CSqlDataProvider($sql, array(
'pagination' => false,
));
$rows = $provider->getData();
var_dump($rows);
您自己决定您更喜欢这些解决方案中的哪一个。但是,后者需要的代码较少PHP,毕竟数据库服务器也可以做一些工作,对吧?
for ($row = 0; $row < 25; $row++) {
$bQuery = 'Select date, billed from {$tableArray[$row][1]}';
$bProvider = new CSqlDataProvider($bQuery, array('pagination'=>false));
$Arr2 = $bProvider->getData();
// merging array to get all loop records in single array
$array_2 = array_merge($array_2, $Arr2);
}
然后print_r$array_2
输出为:
Array
(
[0] => Array
(
[date] => 2016-11-00
[billed] => 100
)
[1] => Array
(
[date] => 2016-12-00
[billed] => 400
)
[2] => Array
(
[date] => 2016-11-00
[billed] => 200
)
// so on
)
我想在 date is same
中求和 billed
。所以这是适用于它的我的代码。
$result = array();
foreach ($array_2 as $data) {
@$result[$data['date']] += $data['billed'];
}
print_r($result);
$newresultGraph = array();
foreach ($result as $date => $billed) {
$newresultGraph[] = array('date' => $date, 'billed' => $billed);
}
print_r($newresultGraph);
上面代码中的print_r($result)
returns我的数据如下,它已经对同一日期的值求和了。
Array
(
[2016-11-00] => 300
[2016-12-00] => 400
)
然后在我上面的代码中,在另一个 foreach 循环之后,我像以前一样在数组中制作我的数据。当我print_r($newresultGraph)
,我的数据是这样的
Array
(
[0] => Array
(
[date] => 2016-11-00
[billed] => 300
)
[1] => Array
(
[date] => 2016-12-00
[billed] => 400
)
)
这对我来说非常有用..因为我的查询是这样的。
Select date, billed from table'
我只从 table 得到 date
, billed
但现在我有另一个字段所以我的查询是这样的..
Select
date,
billed,
((billed * rate) * (myValue) / 100) as my_rev,
((billed * rate) * (opValue) / 100) as op_rev,
From table
所以我有两个新值,它们是 my_rev
和 op_rev
然后print_r$array_2
输出为:
Array
(
[0] => Array
(
[date] => 2016-11-00
[billed] => 100
[my_rev] => 30
[op_rev] => 70
)
[1] => Array
(
[date] => 2016-12-00
[billed] => 400
[my_rev] => 150
[op_rev] => 250
)
[2] => Array
(
[date] => 2016-11-00
[billed] => 200
[my_rev] => 50
[op_rev] => 150
)
// so on
)
这是正确的,
我想对一个日期的所有账单的价值求和,my_rev,op_rev。我不想对账单+my_rev+op_rev求和..
我希望我的数组如下所示:它应该将 billed 的所有值加到 billed 中,类似于 my_rev 和 op_rev。
就像下面的例子。
Array
(
[0] => Array
(
[date] => 2016-11-00
[billed] => 300
[my_rev] => 80
[op_rev] => 220
)
[1] => Array
(
[date] => 2016-12-00
[billed] => 400
[my_rev] => 150
[op_rev] => 250
)
)
我上面的代码将我的 print_r($result)
变成这样:
Array
(
[2016-11-00] => 600
[2016-12-00] => 800
)
我该怎么办?还有其他建议吗?
这段代码可以做到:
$tmp_array = array();
foreach ($array as $val) {
if (array_key_exists($val['date'], $tmp_array)) {
$tmp_array[$val['date']]['billed'] += $val['billed'];
$tmp_array[$val['date']]['my_rev'] += $val['my_rev'];
$tmp_array[$val['date']]['op_rev'] += $val['op_rev'];
} else {
$tmp_array[$val['date']]['date'] = $val['date'];
$tmp_array[$val['date']]['billed'] = $val['billed'];
$tmp_array[$val['date']]['my_rev'] = $val['my_rev'];
$tmp_array[$val['date']]['op_rev'] = $val['op_rev'];
}
}
$result = array_values($tmp_array);
输出:
Array
(
[0] => Array
(
[date] => 2016-11-00
[billed] => 300
[my_rev] => 80
[op_rev] => 220
)
[1] => Array
(
[date] => 2016-12-00
[billed] => 400
[my_rev] => 150
[op_rev] => 250
)
)
)
$tmp_array
以日期为键对数据进行分组,最后用连续的索引替换这些键。如果您更喜欢将日期保留为键 - 它更优化 - 或者不在乎,只需调用 $tmp_array
$result
并删除最后一行。
只需像这样更改您的倒数第二个 foreach,然后打印结果数组,您会看到它会将值与它们的键相加。
$result = array();
foreach ($array_2 as $data) {
@$result[$data['date']]['billed'] += $data['billed'];
@$result[$data['date']]['my_rev'] += $data['my_rev'];
@$result[$data['date']]['op_rev'] += $data['op_rev'];
}
如果需要,您可以相应地更改最后一个 foreach。
使用您的值的结果:
输入:
Array
(
[0] => Array
(
[date] => 2016-11-00
[billed] => 100
[my_rev] => 30
[op_rev] => 70
)
[1] => Array
(
[date] => 2016-12-00
[billed] => 400
[my_rev] => 150
[op_rev] => 250
)
[2] => Array
(
[date] => 2016-11-00
[billed] => 200
[my_rev] => 50
[op_rev] => 150
)
)
结果:
Array
(
[2016-11-00] => Array
(
[billed] => 300
[my_rev] => 80
[op_rev] => 220
)
[2016-12-00] => Array
(
[billed] => 400
[my_rev] => 150
[op_rev] => 250
)
)
有两种选择:
- 计算 PHP 中的总和
- 计算 SQL 中的总和
计算 PHP
中的总和
$sql = <<<SQL
SELECT
date,
billed,
billed * rate * myValue / 100 AS my_rev,
billed * rate * opValue / 100 AS op_rev
FROM
table
SQL;
$provider = new CSqlDataProvider($sql, array(
'pagination' => false,
));
$rows = $provider->getData();
$data = array();
foreach ($rows as $row) {
$date = $row['date'];
// initialize
if (!array_key_exists($date, $data)) {
$data[$date] = array(
'date' => $date,
'billed' => $row['billed',
'my_rev' => $row['my_rev'],
'op_rev' => $row['op_rev',
);
continue;
}
$data[$date]['billed'] += $row['billed'];
$data[$date]['my_rev'] += $row['my_rev'];
$data[$date]['op_rev'] += $row['op_rev'];
}
// sort by key, that is, sort by date
ksort($data);
// remove keys
$data = array_values($data);
var_dump($data);
计算总和 SQL
$sql = <<<SQL
SELECT
date,
SUM(billed),
SUM(billed * rate * myValue / 100) AS my_rev,
SUM(billed * rate * opValue / 100) AS op_rev
FROM
table
GROUP BY
date
ORDER BY
date ASC
SQL;
$provider = new CSqlDataProvider($sql, array(
'pagination' => false,
));
$rows = $provider->getData();
var_dump($rows);
您自己决定您更喜欢这些解决方案中的哪一个。但是,后者需要的代码较少PHP,毕竟数据库服务器也可以做一些工作,对吧?