I’m trying to merge multiple JSON results that I get from an API into a single one.
The JSON data I’m receiving looks like the following:
{ "total": 100, "offset": 0, "articleCollection": [ { "artikelindeling": { "artikelgroep": "string", "artikelgroep_omschrijving": "string", "kernwoord": "string", "kernwoord_omschrijving": "string", "klantgroep": "string", "klantgroep_omschrijving": "string", "plaatsbepaling": "string", "plaatsbepaling_omschrijving": "string", "unieknummerserie": "string" }, "artikelinformatie": { "prijsinformatie": { "actie": { "actie_bruto_inkoopprijs": 0, "actie_consumentenadviesprijs": 0, "actie_datum_tot_en_met": "2020-02-11T18:19:51.747Z", "actie_datum_vanaf": "2020-02-11T18:19:51.747Z" }, "basisprijs_dealer": 0, "btw": "string", "btw_omschrijving": "string", "consumentenadviesprijs": 0 } }, "dateModified": "2020-02-11T18:19:51.747Z", "date_modified": "string", "land": "string", "taal": "string", "valuta": "string" } ] }
Here’s the code I’m going with so far:
$username = $_POST['username']; $password = $_POST['password']; $leverancier = $_POST['leverancier']; $offset = 0; $jsonCombined = array(); $data = call_curl($username, $password, $leverancier, $offset); //First call needed to get total amount $jsonArr = json_decode($data, true); if ($jsonArr['total'] > 50) { //API limits to 50 results per call, need multiple calls. $totalCalls = floor($jsonArr['total'] / 50); //Calculate how many calls are needed. foreach($jsonArr as $record) { $jsonCombined[] = $record; } for ($i = 0; $i < $totalCalls; $i++) { $offset += 50; $data = call_curl($username, $password, $leverancier, $offset); $jsonArr = json_decode($data, true); foreach($jsonArr as $record) { $jsonCombined[] = $record; } } } else { foreach($jsonArr as $record) { $jsonCombined[] = $record; } }
The desired result would be:
Array ( [total] => 100 [offset] => 0 [articleCollection] => Array ( [0] => Array() [1] => Array() [2] => Array()))
However, I’m receiving:
Array ( [0] => 100 [1] => 0 [2] => Array ( [0] => Array() [1] => Array() [2] => Array()))
How would I go about changing this so the keys stay intact and the additional items are added to “articleCollection”?
Advertisement
Answer
As it’s difficult to test properly, this code is as close as I can guess at.
The problem is that when you add the data in with $jsonCombined[]
, this will just add the data to the end of the array in a numerical sequence. This code instead gets the key along with the content in lines like…
foreach($jsonArr as $key => $record)
and then uses this key to add the data with the key…
$jsonCombined[$key] = $record;
The inner loop which fetches the pages of data, only copies the "articleCollection"
elements, this time using $jsonCombined["articleCollection"][]
to just keep on adding the data (this bit is the part I’m not sure exactly if this works OK.)
if ($jsonArr['total'] > 50) { //API limits to 50 results per call, need multiple calls. $totalCalls = floor($jsonArr['total'] / 50); //Calculate how many calls are needed. foreach($jsonArr as $key => $record) { $jsonCombined[$key] = $record; } for ($i = 0; $i < $totalCalls; $i++) { $offset += 50; $data = call_curl($username, $password, $leverancier, $offset); $jsonArr = json_decode($data, true); foreach($jsonArr["articleCollection"] as $record) { $jsonCombined["articleCollection"][] = $record; } } } else { foreach($jsonArr as $key => $record) { $jsonCombined[$key] = $record; } }
The last foreach
may not be needed as it just copies the data from $jsonArr
to $jsonCombined
. So you could just assign the one to the other.