我有以下输入:
$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
(通过递归调用)来获得正确的结果,但我正在寻找一些更优雅的解决方案。
对于这个特定示例,您实际上只需要一个条件和循环。
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;
}
}
但是,我可能会通过基于指标处理计算来采取不同的做法,而不仅仅是动态处理每个指标。
在迭代可变填充的项目时,重新格式化日期并删除日期部分。然后将销售数据压入结果数组中指定的组中;如果再次遇到该组,请将当前值添加到存储的值中。
如果
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);