多维数组的组项(包含不同结构)以及每组的总列值

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

我有以下输入:

$data = [
    [
        'date' => '2014-01-01',
        'sales' => 1,
        'price' => ['usd' => 1, 'eur' => 100],
    ],
    [
        'date' => '2014-01-05',
        'sales' => 1,
        'price' => ['usd' => 1, 'eur' => 100, 'gbp' => 500]
    ],
    [
        'date' => '2016-03-27',
        'sales' => 5,
        'age' => 50
    ],
    [
        'date' => '2016-03-28',
        'sales' => 10
    ]
];

我需要对每组的

sales
列数据和可选出现的
price
列的子元素进行求和,以产生以下结果:

$final = array(
    'March 2016' => array(
        'sales' => 15
    ),
    'January 2014' => array(
        'sales' => 2,
        'price' => array(
            'usd' => 2,
            'eur' => 200,
            'gbp' => 500
        )
    )
);

到目前为止我所做的:

$monthlyData = array();
        
foreach ($dailyData as $day)
{
    $key = date('M y', strtotime($day['date']));

    if (!isset($monthlyData[$key]))
    {
        $monthlyData[$key] = $day;
        continue;
    }

    foreach ($day as $metric => $value)
    {
        if(!empty($value)) 
        {
            $monthlyData[$key][$metric] += $value;
        }
    }
}

我知道我们可以使用好的 ol'

foreach
(通过递归调用)来获得正确的结果,但我正在寻找一些更优雅的解决方案。

php arrays multidimensional-array sum grouping
2个回答
1
投票

对于这个特定示例,您实际上只需要一个条件和循环。

foreach ($day as $metric => $value)
{
    /* Added Condition */
    if(is_array($value))
    {
        foreach($value as $nestedMetric => $nestedValue) {
            $monthlyData[$key][$metric][$nestedMetric] += $nestedValue;
        }
    }
    elseif(!empty($value)) 
    {
        $monthlyData[$key][$metric] += $value;
    }
}

但是,我可能会通过基于指标处理计算来采取不同的做法,而不仅仅是动态处理每个指标。


0
投票

在迭代可变填充的项目时,重新格式化日期并删除日期部分。然后将销售数据压入结果数组中指定的组中;如果再次遇到该组,请将当前值添加到存储的值中。

如果

price
元素有子元素,请迭代它们并将它们推送(或添加)到其指定元素,方式与前面所述的相同。

代码:(演示

$result = [];
foreach ($data as $set) {
    $group = (new DateTime($set['date']))->format('M Y');
    $result[$group]['sales'] = ($result[$group]['sales'] ?? 0) + $set['sales'];
    foreach ($set['price'] ?? [] as $currency => $amount) {
        $result[$group]['price'][$currency] = ($result[$group]['price'][$currency] ?? 0) + $amount;
    }
}
var_export($result);
© www.soinside.com 2019 - 2024. All rights reserved.