首先,我有以下從資料庫回傳的資料。我將分別有兩個不同的資料如下
| 總和1 | 計數 1 | sm__state_name__ | om__order_date__year | om__訂單日期__季度 | om__order_date__month |
|---|---|---|---|---|---|
| 5645000 | 4 | 羅安達 | 2017年 | 3 | 8 |
| 213985939.8600001 | 1606 | 羅安達 | 2017年 | 3 | 9 |
| 7729331.52 | 119 | 本格拉 | 2017年 | 3 | 9 |
| 1012936 | 17 | 扎伊爾 | 2017年 | 3 | 9 |
| 1054883 | 19 | 別 | 2017年 | 3 | 9 |
| 2347944 | 26 | 坎多·庫班戈 | 2017年 | 3 | 9 |
| 428769.6000000001 | 60 | 本戈 | 2017年 | 3 | 9 |
| 6444569 | 86 | 威拉 | 2017年 | 3 | 9 |
| 4914030 | 25 | 庫納 | 2017年 | 3 | 9 |
| 1167200 | 26 | 寬扎北 | 2017年 | 3 | 9 |
| 750080 | 10 | 南寬扎 | 2017年 | 3 | 9 |
| 2178100 | 6 | 萬博 | 2017年 | 3 | 9 |
| 1099934 | 25 | 隆達北 | 2017年 | 3 | 9 |
| 410135 | 12 | 馬蘭熱 | 2017年 | 3 | 9 |
陣列格式
array (
0 =>
array (
'sum1' => '5645000',
'count1' => '4',
'sm__state_name__' => 'Luanda',
'om__order_date__year' => '2017',
'om__order_date__quarter' => '3',
'om__order_date__month' => '8',
),
1 =>
array (
'sum1' => '213985939.8600001',
'count1' => '1606',
'sm__state_name__' => 'Luanda',
'om__order_date__year' => '2017',
'om__order_date__quarter' => '3',
'om__order_date__month' => '9',
),
2 =>
array (
'sum1' => '352839.60000000003',
'count1' => '9',
'sm__state_name__' => NULL,
'om__order_date__year' => '2017',
'om__order_date__quarter' => '3',
'om__order_date__month' => '9',
),
3 =>
array (
'sum1' => '7729331.52',
'count1' => '119',
'sm__state_name__' => 'Benguela',
'om__order_date__year' => '2017',
'om__order_date__quarter' => '3',
'om__order_date__month' => '9',
),
4 =>
array (
'sum1' => '1012936',
'count1' => '17',
'sm__state_name__' => 'Zaire',
'om__order_date__year' => '2017',
'om__order_date__quarter' => '3',
'om__order_date__month' => '9',
),
5 =>
array (
'sum1' => '1054883',
'count1' => '19',
'sm__state_name__' => 'Bie',
'om__order_date__year' => '2017',
'om__order_date__quarter' => '3',
'om__order_date__month' => '9',
),
6 =>
array (
'sum1' => '2347944',
'count1' => '26',
'sm__state_name__' => 'Cuando Cubango',
'om__order_date__year' => '2017',
'om__order_date__quarter' => '3',
'om__order_date__month' => '9',
),
7 =>
array (
'sum1' => '428769.6000000001',
'count1' => '60',
'sm__state_name__' => 'Bengo',
'om__order_date__year' => '2017',
'om__order_date__quarter' => '3',
'om__order_date__month' => '9',
),
8 =>
array (
'sum1' => '6444569',
'count1' => '86',
'sm__state_name__' => 'Huila',
'om__order_date__year' => '2017',
'om__order_date__quarter' => '3',
'om__order_date__month' => '9',
),
9 =>
array (
'sum1' => '4914030',
'count1' => '25',
'sm__state_name__' => 'Cunane',
'om__order_date__year' => '2017',
'om__order_date__quarter' => '3',
'om__order_date__month' => '9',
),
10 =>
array (
'sum1' => '1167200',
'count1' => '26',
'sm__state_name__' => 'Cuanza North',
'om__order_date__year' => '2017',
'om__order_date__quarter' => '3',
'om__order_date__month' => '9',
),
11 =>
array (
'sum1' => '750080',
'count1' => '10',
'sm__state_name__' => 'Cuanza Sul',
'om__order_date__year' => '2017',
'om__order_date__quarter' => '3',
'om__order_date__month' => '9',
),
12 =>
array (
'sum1' => '2178100',
'count1' => '6',
'sm__state_name__' => 'Huambo',
'om__order_date__year' => '2017',
'om__order_date__quarter' => '3',
'om__order_date__month' => '9',
),
13 =>
array (
'sum1' => '1099934',
'count1' => '25',
'sm__state_name__' => 'Lunda North',
'om__order_date__year' => '2017',
'om__order_date__quarter' => '3',
'om__order_date__month' => '9',
),
14 =>
array (
'sum1' => '410135',
'count1' => '12',
'sm__state_name__' => 'Malange',
'om__order_date__year' => '2017',
'om__order_date__quarter' => '3',
'om__order_date__month' => '9',
),
)
Array
(
"sm__state_name__",
"om__order_date__year",
"om__order_date__quarter",
"om__order_date__month",
)
ABOBE 陣列包含可以是任意數量的欄位
以下是我想要的回報的示例輸出
{
"data": [
{
"key": "Luanda",
"items": [
{
"key": 2017,
"items": [
{
"key": 3,
"items": [
{
"key": 8,
"items": null,
"count": 4,
"summary": [
438380.9935
]
},
{
"key": 9,
"items": null,
"count": 1606,
"summary": [
438380.9935
]
},
],
"summary": [
1285085.9636
]
}
],
"summary": [
1285085.9636
]
}
],
"summary": [
1285085.9636
]
},
{
"key": "Benguela",
"items": [
{
"key": 2017,
"items": [
{
"key": 3,
"items": [
{
"key": 9,
"items": null,
"count": 679,
"summary": [
4781987.8575
]
},
],
"summary": [
15017212.0305
]
}
],
"summary": [
15017212.0305
]
}
],
"summary": [
15017212.0305
]
},
{...},
{...},
{...},
],
"totalCount": 22854
}
不要介意匯總值。我只是把虛擬值放在那里。
這種程序甚至可能嗎?因為我想到了很多不同的東西,遞回,多重回圈,三重回圈,但想不出這可行的方法。
我知道這不是問題或錯誤。對不起。但如果有人能指出我正確的方向,那就太好了。
uj5u.com熱心網友回復:
好的,所以基本上如果我理解正確的話,你有一個包含一堆記錄的資料庫。然后,您希望基于資料庫創建一些大型 JSON,該資料庫將基于州、年、季度和月的列具有 4 個維度。然后最外層的陣列將包含按州分組的資料庫記錄,然后任何特定州的專案將根據年份等的鍵進一步壓縮為一組專案。
我認為最有效的方法是單回圈,您可以在其中拉取資料庫中的所有記錄,然后在 PHP 中回圈遍歷它并根據當前記錄迭代構造一些新陣列,稍后可以參考查找目的。
從設定開始:
$dataItems = [];
這將用于存盤和構建資料,以便于查找和計算。
遍歷串列。第一項是:
| 總和1 | 計數 1 | 狀態名稱 | 訂單年 | 訂單季度 | 訂單_月 |
|---|---|---|---|---|---|
| 5645000 | 4 | 羅安達 | 2017年 | 3 | 8 |
然后,您將為迭代運行如下所示的代碼,以幫助填充您要構建的一個或多個陣列:
if (empty($dataItems['Luanda'])) {
$dataItems['Luanda'] = [];
}
if (empty($dataItems['Luanda'][2017])) {
$dataItems['Luanda'][2017] = [];
}
if (empty($dataItems['Luanda'][2017][3])) {
$dataItems['Luanda'][2017][3] = [];
}
if (empty($dataItems['Luanda'][2017][3][8])) {
$dataItems['Luanda'][2017][3][8] = [];
}
$dataItems['Luanda'][2017][3][8][] = ['sum1' => 5645000, 'count1' => 4];
第二項是:
| 總和1 | 計數 1 | 狀態名稱 | 訂單年 | 訂單季度 | 訂單_月 |
|---|---|---|---|---|---|
| 213985939.8600001 | 1606 | 羅安達 | 2017年 | 3 | 9 |
本次迭代的 PHP 代碼如下所示:
if (empty($dataItems['Luanda'])) {
$dataItems['Luanda'] = [];
}
if (empty($dataItems['Luanda'][2017])) {
$dataItems['Luanda'][2017] = [];
}
if (empty($dataItems['Luanda'][2017][3])) {
$dataItems['Luanda'][2017][3] = [];
}
if (empty($dataItems['Luanda'][2017][3][9])) {
$dataItems['Luanda'][2017][3][9] = [];
}
$dataItems['Luanda'][2017][3][9][] = ['sum1' => 213985939.8600001, 'count1' => 1606];
等等。然后你會在$dataItems它被構建后回圈遍歷結構并做風格化邏輯,比如有一個名為“items”的鍵,等等,并創建你想要的輸出結構,然后最后使用 json_encode 以 JSON 格式輸出。
如果您需要像整年的計數之類的東西,在您的初始回圈中,您可以寫入一個單獨的陣列以幫助跟蹤它,一路將其添加在一起,然后在稍后創建具有所需的陣列時參考它輸出結構。您可以輕松地將摘要之類的內容添加到回圈中,并在此程序中對其進行跟蹤。
聽起來很有趣,但是是的,您只需要一個回圈來創建查找或多個查找型別的陣列,然后第二個回圈來參考 loopUp 陣列,從而以所需的輸出格式獲取資料。
uj5u.com熱心網友回復:
對于需要按層次順序分組的可變列陣列,您肯定需要遞回解決此問題。對于遞回呼叫中的每一步,檢查是否存在特定的分組級別,如果不存在,則對其進行初始化。為您的專案使用關聯陣列進行分組,然后轉換為平面陣列。從概念上講,它非常簡單,盡管看起來可能有點令人困惑:
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, $first_column = true) {
foreach($data as $key=>$value) {
if(is_null($value['items'])) {
break;
}
$data[$key]['items'] = flattenData($value['items'], false);
}
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 不是免費的編碼服務,而且您沒有提供任何自己的代碼,我將留下必要的修改作為練習。但是,這應該會洗掉大部分所需的作業,并作為解決方案的有力起點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/397904.html
下一篇:使用本地WSDL發送到遠程URL
