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 から各サブ配列 (またはオブジェクトがある場合はオブジェクト) をループし、日付キーが既に存在するかどうかをテストして追加するか、作成します。

最後に、JSON にエンコードして戻す前に、それを呼び出しarray_values()てキーを取り除き、単純な数値インデックス付き配列にします。Date

$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 に答える