0

複数の JSON ファイルを解析、編集、およびマージして 1 つのオブジェクトにし、最終的に再エンコードして単一の JSON として出力します。

現在、1 つのオブジェクトを解析して編集するときの実際の例がありますが、2 つのオブジェクトを実行して 1 つの結果を得る方法がわかりません。

作業例:

$source = 'http://www.jakedup.com/_/source1';

$data = json_decode(file_get_contents($source));

// THIS WILL BE THE FINAL OUTPUT OBJECT
$output = new stdClass();

// GET THE ARTICLE DATES AS AN ARRAY
$tracks = get_object_vars($data->tracks);

// LOOPS OVER ARTICLE PUBDATES TO GET THE OUTER OBJECTS
foreach ($tracks as $key=>$val) {
  // LOOPS OVER THE INNER OBJECTS IN EACH ARTICLE PUBDATE
  foreach ($data->tracks->$key as $object) {
    // ADD IT ONTO THE OUTPUT OBJECT WITH "ID" AS PARENT NAME
    $output->{$object->id} = $object;
  }
}

echo json_encode($output);

これが私のJSONの例です。2 つの例を提供していますが、無限の数の JSON ファイルを動的にマージする方法を探しています。

JSON ソース 1:

{
    "foo":"bar",
    "tracks":{
        "1349496000":[
            {
                "id":"25328",
                "is_promo":null,
                "is_feature":null,
                "listens":"1312",
                "downloads":"777"
            },
            {
                "id":"25327",
                "is_promo":null,
                "is_feature":null,
                "listens":"1255",
                "downloads":"578"
            },
            {
                "id":"25329",
                "is_promo":null,
                "is_feature":null,
                "listens":"341",
                "downloads":"139"
            }
        ],
        "1349323200":[
            {
                "id":"25310",
                "is_promo":null,
                "is_feature":null,
                "listens":"10793",
                "downloads":"4953"
            }
        ]
    }
}

JSON ソース 2:

{
    "foo":"bar",
    "tracks":{
        "1349323200":[
            {
                "id":"25303",
                "is_promo":null,
                "is_feature":null,
                "listens":"2347",
                "downloads":"1499"
            }
        ],
        "1349236800":[
            {
                "id":"25266",
                "is_promo":null,
                "is_feature":null,
                "listens":"24485",
                "downloads":"19366"
            }
        ]
    }
}

ループでソースを取得するというアイデアをいじくり回してきましたが、データをマージするときに行き詰まりました。私のさまざまな努力のすべてが、正しいデータ構造を生成していません。

現在のテスト コード:

$source = 'http://www.jakedup.com/_/source';
$pages = 2;

    for ($i = 1; $i <= $pages; $i++) {
        $sources[$i] = $source.$i;
        ${'source'.$i} = json_decode(file_get_contents($source.$i));
    }

$source1 と $source2 の 2 つのオブジェクトができましたが、次に何をすればよいかわかりません。

これは私が期待している出力です:

{
    "25328": {
        "id": "25328",
        "is_promo": null,
        "is_feature": null,
        "listens": "1312",
        "downloads": "777",
        "timestamp": "1349496000"
    },
    "25327": {
        "id": "25327",
        "is_promo": null,
        "is_feature": null,
        "listens": "1255",
        "downloads": "578",
        "timestamp": "1349496000"
    },
    "25329": {
        "id": "25329",
        "is_promo": null,
        "is_feature": null,
        "listens": "341",
        "downloads": "139",
        "timestamp": "1349496000"
    },
    "25310": {
        "id": "25310",
        "is_promo": null,
        "is_feature": null,
        "listens": "10793",
        "downloads": "4953",
        "timestamp": "1349323200"
    },
    "25303": {
        "id": "25303",
        "is_promo": null,
        "is_feature": null,
        "listens": "2347",
        "downloads": "1499",
        "timestamp": "1349323200"
    },
    "25266": {
        "id": "25266",
        "is_promo": null,
        "is_feature": null,
        "listens": "24485",
        "downloads": "19366",
        "timestamp": "1349236800"
    }
}

よろしくお願いします。

4

1 に答える 1

4

stdClassこれは、数値プロパティを使用してオブジェクトを構築しようとするのではなく、PHP 配列を使用してもう少し簡単に行うことができます。PHP 配列に連続していないゼロベースのキーがない場合、配列ではなくjson_encode()オブジェクトが自動的に生成されます。同様に、オブジェクトではなく連想配列を生成するオプションの 2 番目のパラメーターがあります。したがって、ファイルを配列としてデコードし、それらをループして、それぞれを出力配列に追加することをお勧めします。{}[]json_decode()idjson_encode()

コードは、「http://www.jakedup.com/_/source1」のような JSON ソース ファイルがあることを意味します。あなたは正しい軌道に乗っていましたが、新しい変数変数を設定する代わりに、ループ内の各ファイルを取得してデコードし、出力配列に直接追加します。

// 5 source numbers, don't have to be consecutive
$sources = array(1,2,3,4,5);
// Output array to be encoded as JSON
$output = array();

// Loop over all the source files, retrieve them and add tracks onto the output    
foreach ($sources as $sourcenum) {
  $source = "http://www.jakedup.com/_/source$sourcenum";
  $source_json = file_get_contents($source);

  // Decode it as an associative array, passing TRUE as second param
  $source_array = json_decode($source_json, TRUE);

  // Now loop over the tracks (which are an array) and append each to the output
  // the original key looks like a timestamp
  foreach ($source_array['tracks'] as $timestamp => $ts) {
    foreach ($ts as $track) {
      // Add the track id to $output as a key
      // This doesn't check if the id already exists...
      // if it does, it will just be overwritten with this one
      $output[$track['id']] = $track;
      // Optionally, save the original timestamp key into the track array
      // Maybe you don't care about this
      $output[$track['id']]['timestamp'] = $timestamp;
    }
  }
}

// Look over your array
var_dump($output);

// Finally, re-encode the whole thing back to JSON
// using JSON_FORCE_OBJECT (even though it shouldn't be necessary)
$output_json = json_encode($output, JSON_FORCE_OBJECT);

JSON 出力:

{
    "25328": {
        "id": "25328",
        "is_promo": null,
        "is_feature": null,
        "listens": "1312",
        "downloads": "777",
        "timestamp": 1349496000
    },
    "25327": {
        "id": "25327",
        "is_promo": null,
        "is_feature": null,
        "listens": "1255",
        "downloads": "578",
        "timestamp": 1349496000
    },
    "25329": {
        "id": "25329",
        "is_promo": null,
        "is_feature": null,
        "listens": "341",
        "downloads": "139",
        "timestamp": 1349496000
    },
    "25310": {
        "id": "25310",
        "is_promo": null,
        "is_feature": null,
        "listens": "10793",
        "downloads": "4953",
        "timestamp": 1349323200
    },
    "25303": {
        "id": "25303",
        "is_promo": null,
        "is_feature": null,
        "listens": "2347",
        "downloads": "1499",
        "timestamp": 1349323200
    },
    "25266": {
        "id": "25266",
        "is_promo": null,
        "is_feature": null,
        "listens": "24485",
        "downloads": "19366",
        "timestamp": 1349236800
    }
}
于 2012-10-08T15:47:44.393 に答える