Лично я принял странность API календаря Java как признак того, что мне нужно было отвлечься от григорианского мышления и попытаться более агрессивно программировать в этом отношении. В частности, я снова научился избегать жестко закодированных констант для таких вещей, как месяцы.
Какое из следующего, скорее всего, будет правильным?
if (date.getMonth() == 3) out.print("March");
if (date.getMonth() == Calendar.MARCH) out.print("March");
Это иллюстрирует одну вещь, которая раздражает меня немного о Joda Time - это может побудить программистов думать в терминах жестко закодированных констант. (Только немного, но это не так, как если бы Joda заставлял программистов плохо программировать.)
Из размещенного массива ... Чтобы закончить в нужном массиве, сначала нужно сделать несколько мелких исправлений. Но я предположил, что это произошло из-за опечаток при копировании здесь ...
Итак, вот массив, с которого я начал:
$result = [
0 => [
"category" => 'Solution',
"name" => 'Name1',
"value1" => 20,
"value2" => 21
],
1 => [
"category" => 'Solution',
"name" => 'Name2',
"value1" => 30,
"value2" => 31
],
2 => [
"category" => 'Solution1',
"name" => 'Name3',
"value1" => 40,
"value2" => 41
]
];
Теперь эта реорганизация данных немного сложнее, чем кажется ... Вам нужно выполнить несколько циклов: [ 118]
Так что здесь это код, которым я закончил:
function groupByProductSuperCategory($datas){
$category = [];
$return = [];
// Find distinct categories
foreach ($datas as $data) {
if(!in_array($data["category"],$category)){
array_push($category,$data["category"]);
}
}
// For each distinct category, add the sum item and the single items
foreach ($category as $cat) {
// Get the sums
if(!in_array($cat,$return)){
$sum1 = 0;
$sum2 = 0;
foreach ($datas as $data) {
if($data["category"] == $cat){
$sum1 += $data["value1"];
$sum2 += $data["value2"];
}
}
}
// Push the sums in the return array
array_push($return,[
"name" => $cat,
"value1" => $sum1,
"value2" => $sum2,
]);
// Push the single elements
foreach ($datas as $data) {
if($cat == $data["category"]){
array_push($return,[
"name" => $data["name"],
"value1" => $data["value1"],
"value2" => $data["value2"],
]);
}
}
}
return $return;
}
Вот PHPFiddle , чтобы попробовать его ... Нажмите [F9] для запуска.