Хорошо, у меня строка 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
для элементов массива, а не ассоциативные массивы.
Вот пример …