按列对二维数组的行进行分组,并对每组中的另一列求和

问题描述 投票:0回答:6

我有这个数组:

Array (
  [0] => Array (
    [TaxeName] => TPS
    [TaxeAmount] => 7
    [Price] => 14
  )
  [1] => Array (
    [TaxeName] => TVQ
    [TaxeAmount] => 9.975
    [Price] => 10
  )
  [2] => Array (
    [TaxeName] => TVQ
    [TaxeAmount] => 9.975
    [Price] => 18
  )
)

我如何获得另一个数组:
- 将

TaxeName
TaxeAmount

分组 - 计算金额的总和
Price
?

像这样:

Array (
  [0] => Array (
    [TaxeName] => TPS
    [TaxeAmount] => 7
    [Price] => 14
  )
  [1] => Array (
    [TaxeName] => TVQ
    [TaxeAmount] => 9.975
    [Price] => 28
  )
)
php arrays multidimensional-array sum grouping
6个回答
0
投票

可以通过嵌套来完成

foreach
:

$original = array(.......); // your current array
$newArr = array();

foreach($original as $origVal){
    $exists = false;
    foreach($newArr as $key => $newVal){
        if($newVal['TaxeName'] == $origVal['TaxeName']){
            $newArr[$key]['Price'] += $origVal['Price'];
            $exists = true;
            break;
        }
    }

    if(!$exists){
        $newArr[] = $origVal;
    }
}

输出

Array
(
    [0] => Array
        (
            [TaxeName] => TPS
            [TaxeAmount] => 7
            [Price] => 14
        )

    [1] => Array
        (
            [TaxeName] => TVQ
            [TaxeAmount] => 9.975
            [Price] => 28
        )

)

0
投票

也许是这样的:

$final = array();
foreach ($arr as $subarr)
{
    if (!isset($final[$subarr['TaxeName']]))
    {
        $final[$subarr['TaxeName']] = array('Price' => 0);
    }
    $final[$subarr['TaxeName']]['TaxeName'] = $subarr['TaxeAmount'];
    $final[$subarr['TaxeName']]['TaxeName'] = $subarr['TaxeName'];
    $final[$subarr['TaxeName']]['Price'] = $final[$subarr['TaxeName']]['Price'] + $subarr['Price'];
}

这个想法是用您需要的值创建一个新数组,并将价格设置为 0 进行初始化,以便您可以在 foreach 中递增它


0
投票

你也可以这样做:

<?php

// Source
$myData = array(
    array(
        'TaxeName' => 'TPS',
        'TaxeAmount' => 7,
        'Price' => 14,
    ),
    array(
        'TaxeName' => 'TVQ',
        'TaxeAmount' => 9.975,
        'Price' => 10,
    ),
    array(
        'TaxeName' => 'TVQ',
        'TaxeAmount' => 9.975,
        'Price' => 18,
    )
);

// Helper Function
function parseData($data)
{
    $parsedData = array();

    if (is_array($data)) {
        foreach ($data as $dataItem) {
            if (!array_key_exists($dataItem['TaxeName'], $parsedData)) {
                $parsedData[$dataItem['TaxeName']] = array(
                    'TaxeName' => $dataItem['TaxeName'],
                    'TaxeAmount' => $dataItem['TaxeAmount'],
                    'Price' => floatval($dataItem['Price'])
                );
            } else {
                $parsedData[$dataItem['TaxeName']]['Price'] += floatval($dataItem['Price']);
            }
        }
    }

    return array_values($parsedData);
}

// Test
$parsed_data = parseData($myData);
var_dump($parsed_data);

?>

输出:

enter image description here


0
投票

只要使用这个函数,输入是你的数组,输出是你需要的数组:

function calculate(array $input){
    $output = [];
    foreach ($input as $v){
        if (array_key_exists($v['TaxeName'], $output)){
            $output[$v['TaxeName']]['Price'] += $v['Price'];
        } else {
            $output[$v['TaxeName']] = $v;
        }
    }

    return array_values($output);
}

0
投票

我知道这里不欢迎具有外部类的解决方案。我展示这个只是为了说明“对 TaxeName 和 TaxeAmount 进行分组”任务。

//use class tablearray from https://github.com/jspit-de/tableArray $data = [ ['TaxeName' => 'TPS', 'TaxeAmount' => 7, 'Price' => 14], ['TaxeName' => 'TVQ', 'TaxeAmount' => 9.975, 'Price' => 10], ['TaxeName' => 'TVQ', 'TaxeAmount' => 9.975, 'Price' => 18], ['TaxeName' => 'TVQ', 'TaxeAmount' => 19.975, 'Price' => 23] ]; $newData = tableArray::create($data) ->filterGroupSum('Price',['TaxeName','TaxeAmount']) ->fetchAll() ; echo '<pre>'; var_export($newData);
输出:

array ( 0 => array ( 'TaxeName' => 'TPS', 'TaxeAmount' => 7, 'Price' => 14, ), 1 => array ( 'TaxeName' => 'TVQ', 'TaxeAmount' => 9.975, 'Price' => 28, ), 2 => array ( 'TaxeName' => 'TVQ', 'TaxeAmount' => 19.975, 'Price' => 23, ), )
    

0
投票
要按单个列进行分组并对每组中的另一列求和,您可以明智地使用

foreach()

array_reduce()

为了避免在结果数组中创建和(稍后删除)临时分组键,请创建一个代表每个唯一组的引用变量,并将该引用推入结果数组中。 当遇到组的后续成员时,仅对引用进行修改。

$result = []; foreach ($array as $row) { // create group if needed if (!isset($ref[$row['TaxeName']])) { $ref[$row['TaxeName']] = $row; // assign base elements of group $result[] =& $ref[$row['TaxeName']]; continue; } // manipulate data within group $ref[$row['TaxeName']]['Price'] += $row['Price']; } var_export($result);
输出:

array ( 0 => array ( 'TaxeName' => 'TPS', 'TaxeAmount' => 7, 'Price' => 14, ), 1 => array ( 'TaxeName' => 'TVQ', 'TaxeAmount' => 9.975, 'Price' => 28, ), )
如果要按多列进行分组(例如 

TaxeName

TaxeAmount
),则在迭代每行时形成多个列值的复合字符串。

换句话说,将上述脚本中所有位置的

$row['TaxeName']

替换为
"{$row['TaxeName']} {$row['TaxeAmount']}"

© www.soinside.com 2019 - 2024. All rights reserved.