简体   繁体   English

如何使用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);
}

Then print_r $array_2 output is: 然后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
)

I want to sum billed where date is same . 我想对date is same地方billed So here is my code which works for it. 所以这是我的代码。

$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);

The print_r($result) in above codes returns me data like this below, It has already summed the values for the same date. 上面代码中的print_r($result)返回如下数据,它已经将同一日期的值相加了。

Array
(
    [2016-11-00] => 300
    [2016-12-00] => 400
)

Then in my above code after another foreach loop, Im making my data like before in array. 然后在上面的代码中,在另一个foreach循环之后,Im使数据像以前一样在数组中。 when i print_r($newresultGraph) , My data is like this. 当我print_r($newresultGraph) ,我的数据是这样的。

Array
(
    [0] => Array
        (
            [date] => 2016-11-00
            [billed] => 300
        )

    [1] => Array
        (
            [date] => 2016-12-00
            [billed] => 400
        )

)

This is working perfectly for me.. because my query was this. 这对我来说是完美的..因为我的查询就是这样。

Select date, billed from table'

I was getting only date , billed from table but now i have another field so my query is like this.. 我只得到了datebilled表,但现在我还有一个领域,所以我的查询是这样的..

Select 
date, 
billed, 
((billed * rate) * (myValue) / 100) as my_rev,
((billed * rate) * (opValue) / 100) as op_rev,
From table

So i have two new values which are my_rev and op_rev 所以我有两个新值,分别是my_revop_rev

Then print_r $array_2 output is: 然后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
)

which is correct, 哪个是对的,

I want to sum the values of all billed, my_rev, op_rev for a date.. I don't want to sum billed+my_rev+op_rev.. 我想对一个日期的所有开票,my_rev,op_rev的值求和。.我不想对billed + my_rev + op_rev求和。

I want my array to be like this below: It should sum all the values of billed into billed, similarly for my_rev and op_rev. 我希望我的数组如下所示:它应该将billed的所有值加到billed中,类似于my_rev和op_rev。

Just like below example. 就像下面的例子一样。

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
    )

)

My above code is turning my print_r($result) into like this: 我上面的代码将我的print_r($result)变成这样:

Array
(
    [2016-11-00] => 600
    [2016-12-00] => 800
)

What should i do? 我该怎么办? any other suggestion? 还有其他建议吗?

This code does it : 这段代码做到了:

$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);

OUTPUT : 输出:

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 as the dates as keys in order to group the data, the last replaces these keys with succesive indexes. $tmp_array作为日期的键,以便对数据进行分组,最后一个用成功索引替换这些键。 If you prefer to keep dates as keys - it's more optimized - or doesn't care, just call $tmp_array $result and delete the last line. 如果您希望保留日期作为键-对其进行了优化-或不在乎,只需调用$tmp_array $result并删除最后一行。

Just change your 2nd last foreach like this and then print the result array and see it will sum values with their keys. 只需像这样更改您的倒数第二个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'];
}

You can change your last foreach accordingly if you need it. 如果需要,您可以相应地更改最后一个foreach。

Result with your values: 结果与您的值:

Input: 输入:

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
    )

)

Result: 结果:

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

There are two options: 有两种选择:

  • calculate sums in PHP 用PHP计算总和
  • calculate sums in SQL 用SQL计算总和

Calculate sums in PHP 用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);

Calculate sums in SQL 用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);

You decide for yourself which of these solutions you prefer. 您可以自己决定选择哪种解决方案。 However, the latter requires less PHP code and after all, the database server can do some work, too, right? 但是,后者需要更少的PHP代码,毕竟数据库服务器也可以做一些工作,对吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM