Перезапись строки 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, получаю массив, и теперь я хочу запустить этот массив и рассчитать итоговые значения для Count1 и Count2 для каждой даты … (и даты могут продолжаться для любого диапазона). Какой самый быстрый / самый быстрый способ сделать это?

Сортируйте цикл через каждую клавишу => val par в foreach, а затем каким-то образом сгруппируйте ключи даты в новый ключ в новом массиве и добавьте итоговые значения там, чтобы я получал это как результат, в канале JSON в самом конце, после json_encode, отсортировано по дате:

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

как бы я группировал значения массива, подобные этому, прежде чем отправлять весь массив в json_encode?

Я думаю, что использование массива $totals проиндексированного по вашей date будет работать здесь (если я правильно вас понимаю). Что-то вроде примера ниже, где $data – ваш декодированный ассоциативный массив 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'], ); } } 

Вы захотите создать выходной массив, который вводится по 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 объекты stdClass для элементов массива, а не ассоциативные массивы.

Вот пример …