2012-12-15 43 views
1

好吧,我有一個JSON字符串:重寫JSON字符串 - 按值將鍵分組到新數組中?

[{ 
"Name": "Title 1", 
"Count1": 556, 
"Count2": 5, 
"Date": "2012-12-05" 
}, { 
"Name": "Title 2", 
"Count1": 10, 
"Count2": 100, 
"Date": "2012-12-05" 
}, { 
"Name": "Title 3", 
"Count1": 798, 
"Count2": 11, 
"Date": "2012-12-04" 
}... 

,我對把json_decode,得到一個數組,現在我想通過陣列運行和計算共1個記錄和彙總共2個記錄每個日期... (並且日期可以繼續任何範圍)。什麼是最快/最快的方式呢?

通過每個鍵的循環分類=> val par在foreach中,然後以某種方式將日期鍵組合到一個新數組中的新鍵並在其中添加總數,以便我將它作爲輸出在JSON飼料在最後,json_encode之後,按日期排序:

[{ 
"Date": "2012-12-05" 
"TotalCount1": 566, 
"TotalCount2": 105, 
}, { 
"Date": "2012-12-04" 
"TotalCount1": 798, 
"TotalCount2": 11, 
}... 

我將如何羣發整個數組json_encode之前數組值這樣呢?

回答

2

我想用$totals數組索引你的date將在這裏工作(如果我理解正確的話)。等,其中$data下面的例子是東西你decoded關聯JSON數組:

$totals = array(); 

foreach ($data as $row) { 
    if (isset($totals[$row['Date']])) { 

     $totals[$row['Date']]['TotalCount1'] 
      = $totals[$row['Date']]['TotalCount1'] + $row['Count1']; 

     $totals[$row['Date']]['TotalCount2'] 
      = $totals[$row['Date']]['TotalCount2'] + $row['Count2']; 

    } else { 

     $totals[$row['Date']] = array(
      'Date' => $row['Date'], 
      'TotalCount1' => $row['Count1'], 
      'TotalCount2' => $row['Count2'], 
     ); 

    } 
} 
+0

如果你解碼爲對象那麼請參閱下面的@ MichaelBerkowski的解決方案;) –

+0

我喜歡那個......好吧,另一個答案也是如此,但這更適合我的需求。謝謝! –

+0

你是否能夠在這一個上打鳴:http://stackoverflow.com/questions/14008236/rewriting-a-json-string-grouping-keys-by-value-into-a-new-two-level - 深陣列/ –

2

您將需要創建一個由Date鍵入的輸出數組。測試JSON中的每個子數組(或對象,如果這就是你所擁有的),測試日期鍵是否已經存在並添加到它,或者創建它。

最後,在它上面調用array_values()去除Date鍵,並在將其編碼回JSON之前將其轉換爲純數字索引數組。

$output = array(); 
foreach ($original_array as $obj) { 
    // If the date key ($obj->Date) already exists in the array, add the counts... 
    if (isset($output[$obj->Date])) { 
    $output[$obj->Date]->Count1 += $obj->Count1; 
    $output[$obj->Date]->Count2 += $obj->Count2; 
    } 
    // Otherwise just append this object onto the output array 
    // For objects, this must be cloned, since it would be saved as a reference otherwise. 
    else { 
    $output[$obj->Date] = clone $obj; 
    } 
} 

// Then strip off the Date keys from the array: 
// ready to call json_encode() on again... 
$output = array_values($output); 

上面假定原來的json_decode()呼叫產生stdClass對象爲陣列的元素,而不是關聯數組。

Here's a sample...

+0

感謝array_values建議! –

+0

你也可以在這張照片上發聲嗎? http://stackoverflow.com/questions/14008236/rewriting-a-json-string-grouping-keys-by-value-into-a-new-two-level-deep-array/ –