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

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

我有这个数组,我需要按

code
列对数据子集进行分组,并对每组中的
product_quantity
列进行求和。

$zone = array (
  0 => 
  array (
    'Bertoua Zone 3' => 
    array (
      0 => 
      array (
        'code' => 'BFT50C',
        'product_quantity' => '4',
        'zone_name' => 'Bertoua Zone 3',
      ),
      1 => 
      array (
        'code' => 'MNY65C',
        'product_quantity' => '10',
        'zone_name' => 'Bertoua Zone 3',
      ),
      2 => 
      array (
        'code' => 'JAP65C',
        'product_quantity' => '7',
        'zone_name' => 'Bertoua Zone 3',
      ),
      3 => 
      array (
        'code' => 'MNY65C',
        'product_quantity' => '4',
        'zone_name' => 'Bertoua Zone 3',
      ),
      4 => 
      array (
        'code' => 'JAP65C',
        'product_quantity' => '3',
        'zone_name' => 'Bertoua Zone 3',
      ),
      5 => 
      array (
        'code' => 'BFT50C',
        'product_quantity' => '3',
        'zone_name' => 'Bertoua Zone 3',
      ),
      6 => 
      array (
        'code' => 'JAP65C',
        'product_quantity' => '2',
        'zone_name' => 'Bertoua Zone 3',
      ),
    ),
    'Bertoua Zone 1' => 
    array (
      0 => 
      array (
        'code' => 'MNY65C',
        'product_quantity' => '5',
        'zone_name' => 'Bertoua Zone 1',
      ),
      1 => 
      array (
        'code' => 'JAP65C',
        'product_quantity' => '3',
        'zone_name' => 'Bertoua Zone 1',
      ),
      2 => 
      array (
        'code' => 'BFT50C',
        'product_quantity' => '7',
        'zone_name' => 'Bertoua Zone 1',
      ),
      3 => 
      array (
        'code' => 'MNY65C',
        'product_quantity' => '15',
        'zone_name' => 'Bertoua Zone 1',
      ),
      4 => 
      array (
        'code' => 'JAP65C',
        'product_quantity' => '5',
        'zone_name' => 'Bertoua Zone 1',
      ),
      5 => 
      array (
        'code' => 'BFT50C',
        'product_quantity' => '4',
        'zone_name' => 'Bertoua Zone 1',
      ),
    ),
  ),
)

我想得到这个结果:

$recapByZone = array (
  0 => 
  array (
    'Bertoua Zone 3' => 
    array (
      0 => 
      array (
        'code' => 'BFT50C',
        'product_quantity' => 7,
        'zone_name' => 'Bertoua Zone 3',
      ),
      1 => 
      array (
        'code' => 'MNY65C',
        'product_quantity' => 14,
        'zone_name' => 'Bertoua Zone 3',
      ),
      2 => 
      array (
        'code' => 'JAP65C',
        'product_quantity' => 12,
        'zone_name' => 'Bertoua Zone 3',
      ),
    ),
    'Bertoua Zone 1' => 
    array (
      0 => 
      array (
        'code' => 'MNY65C',
        'product_quantity' => 20,
        'zone_name' => 'Bertoua Zone 1',
      ),
      1 => 
      array (
        'code' => 'JAP65C',
        'product_quantity' => 8,
        'zone_name' => 'Bertoua Zone 1',
      ),
      2 => 
      array (
        'code' => 'BFT50C',
        'product_quantity' => 11,
        'zone_name' => 'Bertoua Zone 1',
      ),
    ),
  ),
)
php arrays multidimensional-array sum grouping
2个回答
1
投票

我已尽力而为,它与您的示例代码略有不同。

参见https://onecompiler.com/php/3ybbmywrp

 $zone = '[{"Bertoua Zone 3":[{"code":"BFT50C","product_quantity":"4","zone_name":"Bertoua Zone 3"},{"code":"MNY65C","product_quantity":"10","zone_name":"Bertoua Zone 3"},{"code":"JAP65C","product_quantity":"7","zone_name":"Bertoua Zone 3"},{"code":"MNY65C","product_quantity":"4","zone_name":"Bertoua Zone 3"},{"code":"JAP65C","product_quantity":"3","zone_name":"Bertoua Zone 3"},{"code":"BFT50C","product_quantity":"3","zone_name":"Bertoua Zone 3"},{"code":"JAP65C","product_quantity":"2","zone_name":"Bertoua Zone 3"}],"Bertoua Zone 1":[{"code":"MNY65C","product_quantity":"5","zone_name":"Bertoua Zone 1"},{"code":"JAP65C","product_quantity":"3","zone_name":"Bertoua Zone 1"},{"code":"BFT50C","product_quantity":"7","zone_name":"Bertoua Zone 1"},{"code":"MNY65C","product_quantity":"15","zone_name":"Bertoua Zone 1"},{"code":"JAP65C","product_quantity":"5","zone_name":"Bertoua Zone 1"},{"code":"BFT50C","product_quantity":"4","zone_name":"Bertoua Zone 1"}]}]';
        $zone = json_decode($zone, true);

        $zone2 = '[{"Bertoua Zone 3":[{"code":"BFT50C","product_quantity":"7","zone_name":"Bertoua Zone 3"},{"code":"MNY65C","product_quantity":"14","zone_name":"Bertoua Zone 3"},{"code":"JAP65C","product_quantity":"12","zone_name":"Bertoua Zone 3"}],"Bertoua Zone 1":[{"code":"MNY65C","product_quantity":"20","zone_name":"Bertoua Zone 1"},{"code":"JAP65C","product_quantity":"8","zone_name":"Bertoua Zone 1"},{"code":"BFT50C","product_quantity":"11","zone_name":"Bertoua Zone 1"}]}]';
        $zone2 = json_decode($zone2, true);

        $result = [];
        foreach ($zone[0] as $key => $element) {
            foreach ($element as $value) {
                if (isset($result[$key][$value['code']])) {
                    $result[0][$key][$value['code']]['product_quantity'] += $value['product_quantity'];
                } else {
                    $result[0][$key][$value['code']] = $value;
                }
            }
        }

        echo '<pre>';
        echo print_r($result);
        echo '</pre>';
        echo '<hr>';
        echo '<pre>';
        echo print_r($zone2);
        echo '</pre>';


0
投票

遇到唯一的

code
值时,将新的组引用推入结果数组中。 否则,当之前遇到过
code
值时,请将
product_quantity
添加到组的
product_quantity
值中。

迭代数据子集后,用分组数据覆盖原始行数据。

我不知道你唯一的第一级是否有多个元素,但我会为此编写一个 foreach 循环,以防万一。

$payload = json_decode('[{"Bertoua Zone 3":[{"code":"BFT50C","product_quantity":"4","zone_name":"Bertoua Zone 3"},{"code":"MNY65C","product_quantity":"10","zone_name":"Bertoua Zone 3"},{"code":"JAP65C","product_quantity":"7","zone_name":"Bertoua Zone 3"},{"code":"MNY65C","product_quantity":"4","zone_name":"Bertoua Zone 3"},{"code":"JAP65C","product_quantity":"3","zone_name":"Bertoua Zone 3"},{"code":"BFT50C","product_quantity":"3","zone_name":"Bertoua Zone 3"},{"code":"JAP65C","product_quantity":"2","zone_name":"Bertoua Zone 3"}],"Bertoua Zone 1":[{"code":"MNY65C","product_quantity":"5","zone_name":"Bertoua Zone 1"},{"code":"JAP65C","product_quantity":"3","zone_name":"Bertoua Zone 1"},{"code":"BFT50C","product_quantity":"7","zone_name":"Bertoua Zone 1"},{"code":"MNY65C","product_quantity":"15","zone_name":"Bertoua Zone 1"},{"code":"JAP65C","product_quantity":"5","zone_name":"Bertoua Zone 1"},{"code":"BFT50C","product_quantity":"4","zone_name":"Bertoua Zone 1"}]}]', true);

$result = [];
foreach ($payload as $index => $zones) {
    foreach ($zones as $zone => $rows) {
        unset($ref);
        $grouped = [];
        foreach ($rows as $row) {
            if (!isset($ref[$row['code']])) {
                $ref[$row['code']] = $row;
                $grouped[] =& $ref[$row['code']];
                continue;
            }
            $ref[$row['code']]['product_quantity'] += $row['product_quantity'];
        }
        $result[$index][$zone] = $grouped;
    }
}
var_export($result);
© www.soinside.com 2019 - 2024. All rights reserved.