簡體   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);
}

然后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)返回如下數據,它已經將同一日期的值相加了。

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

然后在上面的代碼中,在另一個foreach循環之后,Im使數據像以前一樣在數組中。 當我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'

我只得到了datebilled表,但現在我還有一個領域,所以我的查詢是這樣的..

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

所以我有兩個新值,分別是my_revop_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的值求和。.我不想對billed + 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代碼,畢竟數據庫服務器也可以做一些工作,對嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM