簡體   English   中英

如何對多維數組進行分組和求和?

[英]How to group by and sum a multi-dimensional array?

我已經看過這個stackoverflow頁面,但是它沒有幫助我。

我想按兩列分組並求和第三列的值。

如果discount_iddis_percent相同,則添加discount_value

這是我的數組:

$dis = [
    [['Dis_id' => 'Dl-Dis1'], ['Dis_per' => '7.500'], ['Dis_val' => '192.75']],
    [['Dis_id' => 'Dl-Dis2'], ['Dis_per' => '2.500'], ['Dis_val' => '97.88']],
    [['Dis_id' => 'Dl-Dis1'], ['Dis_per' => '5.000'], ['Dis_val' => '39.90']],
    [['Dis_id' => 'Dl-Dis2'], ['Dis_per' => '2.500'], ['Dis_val' => '99.90']]
];

我需要的輸出是:

D1-Dis1->7.5->192.75
D1-Dis1->5.0->39.9
D1-Dis2->2.5->197.78

我的代碼如下所示:

$newarr = array();
$reverse_map = array();

foreach($dis as $idx => $entry) {
    if (isset($reverse_map[$entry['Dis_id']])) {
         // have we seen this name before? retrieve its original index value
         $idx = $reverse_map[$entry['Dis_id']]; 
    } else {
         // nope, new name, so store its index value
         $reverse_map[$entry['Dis_id']] = $idx;
    }

    // copy the 'constant' values
    $newarr[$idx]['Dis_id'] = $entry['Dis_id'];
    $newarr[$idx]['Dis_per'] = $entry['Dis_per'];

    // sum the qtd_post values to whatever we previously stored.        
    foreach($entry['Dis_val'] as $x => $y) {
        $newarr[$idx]['Dis_val'][$x] += $y;
    }
}

基於您的預期數組結構是這樣的理解,這是我提出的解決方案。

$dis = array(
    array(
        'Dis_id'  => 'Dl-Dis1',
        'Dis_per' => 7.500,
        'Dis_val' => 192.75
    ),
    ...
);

它通過創建一個多維數組來確定解決方案,其中第一個維度為Dis_id ,第二個維度為Dis_per ,該值成為Dis_val的總和。

$sums = array();

foreach ($dis as $entry) {
    if (!isset($sums[$entry['Dis_id']])) {
        $sums[$entry['Dis_id']] = array();
    }
    if (!isset($sums[$entry['Dis_id']]["{$entry['Dis_per']}"])) {
        $sums[$entry['Dis_id']]["{$entry['Dis_per']}"] = 0;
    }
    $sums[$entry['Dis_id']]["{$entry['Dis_per']}"] += $entry['Dis_val'];
}

請參見此工作示例; https://eval.in/158661

在迭代輸入數組時,需要隔離Dis_idDis_per值,並在存儲Dis_val時將它們用作鍵。

如果[Dis_id][Dis_per]元素不存在任何值,則可以簡單地存儲該值。 如果存在一個預先存在的值,則需要將新值添加到存儲的值中。 isset()是最有效的函數,有助於識別結果數組中的新元素/現有元素。

代碼:( 演示

$dis = [
    [['Dis_id' => 'Dl-Dis1'], ['Dis_per' => '7.500'], ['Dis_val' => '192.75']],
    [['Dis_id' => 'Dl-Dis2'], ['Dis_per' => '2.500'], ['Dis_val' => '97.88']],
    [['Dis_id' => 'Dl-Dis1'], ['Dis_per' => '5.000'], ['Dis_val' => '39.90']],
    [['Dis_id' => 'Dl-Dis2'], ['Dis_per' => '2.500'], ['Dis_val' => '99.90']]
];

foreach ($dis as $group) {
    $id = $group[0]['Dis_id'];
    $per = $group[1]['Dis_per'];
    if (!isset($result[$id][$per])) {
        $result[$id][$per] = $group[2]['Dis_val'];
    } else {
        $result[$id][$per] += $group[2]['Dis_val'];
    }
}
var_export($result);

輸出:

array (
  'Dl-Dis1' => 
  array (
    '7.500' => '192.75',
    '5.000' => '39.90',
  ),
  'Dl-Dis2' => 
  array (
    '2.500' => 197.78,
  ),
)

暫無
暫無

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

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