【问题标题】:PHP Group By Array of Object using 2 KeysPHP 使用 2 个键按对象数组分组
【发布时间】:2021-09-07 16:04:00
【问题描述】:

我必须使用 PHP 将原始数据修改为一组新数据,原始查询将返回如下:

Result                                   Expected Result :
[                                        [
 {                                        {
  'PRODUCT' : 'BANANA',                    'PRODUCT' : 'BANANA',
  'BUY_PERIOD' : '202101',                 'BUY_PERIOD' : '202101',
  'SALES_PERIOD' : '202101',               'SALES_PERIOD' : [ 
  'PERCENT_OF_SALES' : "20",                                 {
 },                                                            '202101' : "20",
 {                                                             '202102' : "10",
  'PRODUCT' : 'BANANA',                                        '202103' : "15",
  'BUY_PERIOD' : '202101',                                     '202104' : "35"
  'SALES_PERIOD' : '202102',                                 }
  'PERCENT_OF_SALES' : "10",                                ]
 },                                       }
 {                                       ]
  'PRODUCT' : 'BANANA',
  'BUY_PERIOD' : '202101',
  'SALES_PERIOD' : '202103',
  'PERCENT_OF_SALES' : "15",
 },
 {
  'PRODUCT' : 'BANANA',
  'BUY_PERIOD' : '202101',
  'SALES_PERIOD' : '202104',
  'PERCENT_OF_SALES' : "35",
 },
]

我需要预期的结果来做类似的事情:

在我之前的问题中,我已经使用 JavaScript ES6 提出了类似的问题。这是我之前的问题的链接JSON Multidimensional Array to HTML Table
这一次,我必须使用 PHP (Laravel)
任何形式的帮助都会非常感激,谢谢

【问题讨论】:

  • @DefinitelynotRafal 我之前尝试过第一个代码,第二个代码几乎可以工作,但仍在修改它。结果还是不如预期
  • 那么您应该能够向我们展示您尝试过的内容,以及您希望执行的操作。这样我们就可以改进您的尝试并帮助您了解问题所在。

标签: php arrays json multidimensional-array


【解决方案1】:

您可以使用array_reduce 函数作为方法:

$result = array_reduce(
    $data,
    function($res, $el) {
        if (isset($res[$el['PRODUCT'] . "-" . $el['BUY_PERIOD']])) {
            $res[$el['PRODUCT'] . "-" . $el['BUY_PERIOD']]['SALES_PERIOD'][$el['SALES_PERIOD']] = $el['PERCENT_OF_SALES'];
        } else {
            $res[$el['PRODUCT'] . "-" . $el['BUY_PERIOD']] = [
                'PRODUCT' => $el['PRODUCT'],
                'BUY_PERIOD' => $el['BUY_PERIOD'],
                'SALES_PERIOD' => [
                    $el['SALES_PERIOD'] => $el['PERCENT_OF_SALES']
                ]
            ];
        }
        
        return $res;
    },
    
    $res
);

PHP execute online

【讨论】:

  • 这很好用,但是如果我添加更多的 buy_period 数据,例如 202102 ,新的购买期就不会出现
  • 在这里我添加了新的购买期。看起来不错:phpize.online/…
  • 谢谢先生,这让我可以继续使用新数据集制作数据透视表
【解决方案2】:

这不会完全按照您需要的格式返回数据,但会使用问题指定的两个键为您提供相同的嵌套结构。使用PRODUCT 作为数组中的第一个键,然后使用SALES_PERIOD 作为第二个键。通过foreach将每一行添加到嵌套数组中

foreach($result as $row){
    $return[$row['PRODUCT']]['PRODUCT'] = $result['PRODUCT'];
    $return[$row['PRODUCT']]['BUY_PERIOD'] = $result['BUY_PERIOD'];
    $return[$row['PRODUCT']]['SALES_PERIOD'][$result['SALES_PERIOD']] = $result['PERCENT_OF_SALES'];
}

json_encode($return);

【讨论】:

    猜你喜欢
    • 2015-05-08
    • 2021-11-19
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多