使用动态键将平面数组转换为多维数组.有可能吗



首先,我从数据库返回了以下数据。我将有两个不同的数据,分别如下

Huambo2017
sum1
5645000
213985939.8600001 7729331.52 1012936 1054883 2347944 428769.6000000001 6444569 4914030 1167200 750080 2178100 63
1099934 410135

有了一个需要按层次顺序分组的列的可变数组,您肯定想要一个递归解决方案来解决这个问题。对于递归调用中的每一步,请检查是否存在特定的分组级别,如果不存在,则对其进行初始化。对项使用关联数组进行分组,然后转换为平面数组。它在概念上非常简单,尽管看起来可能有点令人困惑:

function aggregateData($data, $db_row, $columns, $first_column = true) {
// Base case: with no more columns left, we just take the sum and return.
if(empty($columns)) {
$data['summary'] += $db_row['sum1'];
return $data;
}
$column = array_shift($columns);
$value = $db_row[$column];
if($first_column) {
// First column is a special case. We don't add anything here because every level's summary is the sum of its nested items.
if(!array_key_exists($value, $data)) {
$data[$value] = [
'key'=>$value,
'items'=>empty($columns) ? null : [],
'summary'=>0
];
}
$data[$value] = aggregateData($data[$value], $db_row, $columns, false);
} else {
// For all other columns, we add the sum to each nested level.
if(!array_key_exists($value, $data['items'])) {
$data['items'][$value] = [
'key'=>$value,
'items'=>empty($columns) ? null : [],
'summary'=>0
];
}
$data['summary'] += $db_row['sum1'];
$data['items'][$value] = aggregateData($data['items'][$value], $db_row, $columns, false);
}
return $data;
}
function flattenData($data) {
foreach($data as $key=>$value) {
if(is_null($value['items'])) {
break;
}
$data[$key]['items'] = flattenData($value['items']);
}
return array_values($data);
}
$db_rows = /* your DB retrieval code here */;
$columns = /* columns to group by in hierarchical order */;
$data = [];
foreach($db_rows as $db_row) {
$data = aggregateData($data, $db_row, $columns);
}
$data = flattenData($data);

为了帮助理解正在发生的事情,请考虑最高级别,按州分组。在aggregateData()调用之后,在压平数组之前,它将生成如下结构:

{
"Luanda": {
"key": "Luanda",
"items": {...},
"summary": ...,
},
"Benguela": {
"key": "Benguela",
"items": {...},
"summary": ...,
}
}

请注意,由于每个条目都与对象中的键相关联,而不是与数组中的索引相关联,因此可以轻松查找,因此我们可以在每个级别聚合信息。扁平化后,我们得到的是:

[
{
"key": "Luanda",
"items": [...],
"summary": ...,
},
{
"key": "Benguela",
"items": [...],
"summary": ...,
}
]

每个条目不再与其关键字相关联,而是所需的平面数组。我们失去了进行简单查找的能力,但在计算结束时不再需要这种能力。

上面的内容并不能解决你的全部问题,因为这个结果中没有包括一些数据点,但由于stackoverflow不是一个免费的编码服务,你也没有提供任何自己的代码,我将留下必要的修改作为练习。然而,这应该可以消除所需的大量工作,并作为解决方案的一个强有力的起点。

好的,所以基本上,如果我正确理解这一点,你就有了一个包含大量记录的数据库。然后,您需要在数据库的基础上创建一些巨大的JSON,该数据库将具有基于状态、年份、季度和月份列的4个维度。然后,最外层的数组将包含按状态分组的数据库记录,然后任何特定状态的项目将根据年份等的关键字进一步压缩为一组项目。

我认为最有效的方法是使用一个循环,在这个循环中,您可以提取数据库中的所有记录,然后用PHP对其进行循环,并根据当前的记录迭代构建一些新的数组,这些数组稍后可以用于查找。

通过设置开始:

$dataItems = [];

这将用于存储和结构化数据,以便轻松查找和计算。

遍历列表。第一项是:

sum1
5645000

最新更新