1

好的,我有一个 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 的总数......(并且日期可以在任何范围内继续)。最快/最好的方法是什么?

在 foreach 中遍历每个键 => val par 的排序,然后以某种方式将日期键分组到新数组中的新键中并在其中添加总计,以便我在 JSON 提要中将其作为输出最后,在 json_encode 之后,按日期排序:

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

在将整个数组发送到 json_encode 之前,我将如何对数组值进行分组?

4

2 回答 2

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为数组元素生成对象,而不是关联数组。

这是一个样本...

于 2012-12-15T21:44:49.653 回答
2

我认为使用$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'],
        );

    }
}
于 2012-12-15T21:45:13.493 回答