Reescrevendo uma string JSON – agrupando chaves por valor em uma nova matriz de nível de dois níveis?

Basta construir em cima da minha pergunta anterior aqui:

Reescrevendo uma string JSON – agrupando chaves por valor em uma nova matriz?

Eu estou me perguntando como faço para percorrer a matriz dada e aproveitá-la para que a saída saia algo assim:

[{ "Name": "Title 1", "Date": "2012-12-05", "rows": [ { "Subtitle": "Subtitle 1", "Count1": 566, "Count2": 105 }, { "Subtitle": "Subtitle 2", "Count1": 76, "Count2": 15 } ] }, { "Name": "Title 2", "Date": "2012-12-06", "rows": [ { "Count1": 66, "Count2": 5 }... 

onde a matriz original do json é agrupada pela coluna “Nome” e, em seguida, é classificada em uma estrutura de vários níveis como essa (estrutura json de pai / filho múltiplo para criar o menu corretamente em nosso aplicativo)?

Os dados originais do json se parecem com isto:

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

e, obviamente, estou procurando uma solução em PHP, como vou ler nos dados do json, processá-lo e cuspi-lo reformatado.

Assumindo arrays associativos e sorting de saída por nome:

 $output = array(); for ($data as $row) { if (!isset($output[$row['Name']])) { $output[$row['Name']] = array( 'Name' => $row['Name'], 'Date' => $row['Date'], 'rows' => array() ); } $output[$row['Name']]['rows'][] = array( 'Subtitle' => $row['Subtitle'], 'Count 1' => $row['Count 1'], 'Count 2' => $row['Count 2'] ); } 
 hash = {}; result = []; for (var i = 0; i < data.length; i++) { var name = data[i].Name; if (!hash.hasOwnProperty(name)) { var newitem = { Name: name, Date: data[i].Date, rows: [] }; result.push(newitem); hash[name] = newitem; } hash[name].rows.push({ Subtitle: data[i].Subtitle, Count1: data[i].Count1, Count2: data[i].Count2 }); }