Loop through nested JSON array using PHP [duplicate] - php

This question already has answers here:
PHP multidimensional array get value by key
(2 answers)
Closed 4 months ago.
I have a JSON array as follows:
[
{
"custClass": [
{
"code": "50824109d3b1947c9d9390ac5caae0ef",
"desc": "e1f96b98047adbc39f8baf8f4aa36f41"
},
{
"code": "dab6cc0ed3688f96333d91fd979c5f74",
"desc": "d0e850f728b2febee79e1e7d1186c126"
},
{
"code": "bc4050f8f891296528ad6a292b615e86",
"desc": "bee3120e77092d889c3b9e27cbee75bd"
},
{
"code": "f13fc8c35dfe206a641207c6054dd9a0",
"desc": "32a81cb610805d9255d5f11354177414"
},
{
"code": "2117c346d9b3dfebf18acc8b022326d4",
"desc": "88a8e85db11976082fed831c4c83838e"
},
{
"code": "95c0674fc0e0434f52a60afce74571d2",
"desc": "39c4d4bca1578194801f44339998e382"
},
{
"code": "c8ad6f709612d2a91bb9f14c16798338",
"desc": "6b4c4d5f4ae609742c1b6e62e16f8650"
}
],
"sourceData": [
{
"sourceId": "ff64060a40fc629abf24eb03a863fd55",
"sourceName": "92aa69979215a2bf6290c9a312c5891f"
}
]
}
]
I want to loop through this nested JSON array to retrieve all the "desc" from the "custClass" list using PHP.
Any help would be appreciated.

You can try this way
$json='{
"custClass": [
{
"code": "50824109d3b1947c9d9390ac5caae0ef",
"desc": "e1f96b98047adbc39f8baf8f4aa36f41"
},
{
"code": "dab6cc0ed3688f96333d91fd979c5f74",
"desc": "d0e850f728b2febee79e1e7d1186c126"
},
{
"code": "bc4050f8f891296528ad6a292b615e86",
"desc": "bee3120e77092d889c3b9e27cbee75bd"
},
{
"code": "f13fc8c35dfe206a641207c6054dd9a0",
"desc": "32a81cb610805d9255d5f11354177414"
},
{
"code": "2117c346d9b3dfebf18acc8b022326d4",
"desc": "88a8e85db11976082fed831c4c83838e"
},
{
"code": "95c0674fc0e0434f52a60afce74571d2",
"desc": "39c4d4bca1578194801f44339998e382"
},
{
"code": "c8ad6f709612d2a91bb9f14c16798338",
"desc": "6b4c4d5f4ae609742c1b6e62e16f8650"
}
],
"sourceData": [
{
"sourceId": "ff64060a40fc629abf24eb03a863fd55",
"sourceName": "92aa69979215a2bf6290c9a312c5891f"
}
]
}';
$decode=json_decode($json,true);
$desc=[];
foreach($decode['custClass'] as $cust){
$desc[]=$cust['desc'];
}
var_dump($desc);

You can decode data and loop it
$s = '[
{
"custClass": [
{
"code": "50824109d3b1947c9d9390ac5caae0ef",
"desc": "e1f96b98047adbc39f8baf8f4aa36f41"
},
{
"code": "dab6cc0ed3688f96333d91fd979c5f74",
"desc": "d0e850f728b2febee79e1e7d1186c126"
},
{
"code": "bc4050f8f891296528ad6a292b615e86",
"desc": "bee3120e77092d889c3b9e27cbee75bd"
},
{
"code": "f13fc8c35dfe206a641207c6054dd9a0",
"desc": "32a81cb610805d9255d5f11354177414"
},
{
"code": "2117c346d9b3dfebf18acc8b022326d4",
"desc": "88a8e85db11976082fed831c4c83838e"
},
{
"code": "95c0674fc0e0434f52a60afce74571d2",
"desc": "39c4d4bca1578194801f44339998e382"
},
{
"code": "c8ad6f709612d2a91bb9f14c16798338",
"desc": "6b4c4d5f4ae609742c1b6e62e16f8650"
}
],
"sourceData": [
{
"sourceId": "ff64060a40fc629abf24eb03a863fd55",
"sourceName": "92aa69979215a2bf6290c9a312c5891f"
}
]
}
]';
$data =json_decode($s,true);
foreach($data as $obj){
foreach($obj['custClass'] as $val){
echo "Desc ".$val['desc']."<br/>";
}
}

Try decoding data and retrieve it using foreach:
$your_data = your_data;
$decoded_data = json_decode($your_data [0], true);
$final_data = [];
foreach($decoded_data['custClass'] as $data) {
$final_data[] = $data['desc'];
}
print_r($final_data);

try this code
loop this array like below
foreach(json_decode($data) as $key=>$value){
foreach($value->custClass as $key1=>$value1){
echo $value1->desc;
}
}
json_decode() the data
<?php
$data= '[
{
"custClass": [
{
"code": "50824109d3b1947c9d9390ac5caae0ef",
"desc": "e1f96b98047adbc39f8baf8f4aa36f41"
},
{
"code": "dab6cc0ed3688f96333d91fd979c5f74",
"desc": "d0e850f728b2febee79e1e7d1186c126"
},
{
"code": "bc4050f8f891296528ad6a292b615e86",
"desc": "bee3120e77092d889c3b9e27cbee75bd"
},
{
"code": "f13fc8c35dfe206a641207c6054dd9a0",
"desc": "32a81cb610805d9255d5f11354177414"
},
{
"code": "2117c346d9b3dfebf18acc8b022326d4",
"desc": "88a8e85db11976082fed831c4c83838e"
},
{
"code": "95c0674fc0e0434f52a60afce74571d2",
"desc": "39c4d4bca1578194801f44339998e382"
},
{
"code": "c8ad6f709612d2a91bb9f14c16798338",
"desc": "6b4c4d5f4ae609742c1b6e62e16f8650"
}
],
"sourceData": [
{
"sourceId": "ff64060a40fc629abf24eb03a863fd55",
"sourceName": "92aa69979215a2bf6290c9a312c5891f"
}
]
}
]';
foreach(json_decode($data) as $key=>$value){
foreach($value->custClass as $key1=>$value1){
echo $value1->desc;
}
}
?>

You can loop through all JSON Arrays by using a recursive algorithm.
$myJsonArray = '<as-your-above-json-array>';
# Convert $myJsonArray into an associative array
$myJsonArray = json_decode($myJsonArray, true);
recursiveArray($myJsonArray);
# A recursive function to traverse the $myJsonArray array
function recursiveArray(array $myJsonArray)
{
foreach ($myJsonArray as $key => $hitElement) {
# If there is a element left
if (is_array($hitElement)) {
# call recursive structure to parse the jsonArray
recursiveArray($hitElement);
} else {
if ($key === 'desc') {
echo $hitElement . PHP_EOL;
}
}
}
}
/**
OUTPUT
e1f96b98047adbc39f8baf8f4aa36f41
d0e850f728b2febee79e1e7d1186c126
bee3120e77092d889c3b9e27cbee75bd
32a81cb610805d9255d5f11354177414
88a8e85db11976082fed831c4c83838e
39c4d4bca1578194801f44339998e382
6b4c4d5f4ae609742c1b6e62e16f8650
*/
Live code -> https://wtools.io/php-sandbox/bFEJ
OR use the RecursiveArrayIterator to traverse the $myJsonArray array
$myJsonArray = json_decode($myJsonArray, true);
$myIterator = new RecursiveArrayIterator($myJsonArray);
recursiveArray($myIterator);
function recursiveArray(RecursiveArrayIterator $myIterator)
{
while ($myIterator->valid()) {
if ($myIterator->hasChildren()) {
recursiveArray($myIterator->getChildren());
} else {
if ($myIterator->key() === 'desc') {
echo $myIterator->current() . PHP_EOL;
}
}
$myIterator->next();
}
}
Live code -> https://wtools.io/php-sandbox/bFEL

Related

How I can read and update the nested JSON in PHP

I am new to PHP and have little experience with PHP arrays, I have this below JSON file.
$json2=
'{
"location": "westus",
"properties": {
"hardwareProfile": {
"vmSize": "Standard_D1_v2"
},
"storageProfile": {
"imageReference": {
"sku": "2016-Datacenter",
"publisher": "MicrosoftWindowsServer",
"version": "latest",
"offer": "WindowsServer"
},
"osDisk": {
"caching": "ReadWrite",
"managedDisk": {
"storageAccountType": "Standard_LRS"
},
"name": "myVMosdisk",
"createOption": "FromImage"
}
},
"networkProfile": {
"networkInterfaces": [
{
"id": "/subscriptions/{subscription-id}/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/{existing-nic-name}",
"properties": {
"primary": true
}
}
]
},
"osProfile": {
"adminUsername": "{your-username}",
"computerName": "myVM",
"adminPassword": "{your-password}"
},
"diagnosticsProfile": {
"bootDiagnostics": {
"storageUri": "http://{existing-storage-account-name}.blob.core.windows.net",
"enabled": true
}
}
}
}';
I want to update the values for 'location', 'vmSize','sku','publisher','offer' in the above JSON,
"location" : "eastus"
"vmSize" : "Standard_D3_v2"
"sku" : "20h1-evd"
"publisher" : "MicrosoftWindowsDesktop"
"offer" : "windows-10"
I have tried to do the following to this but I am nowhere near navigating the array correctly.
$arr = json_decode($json2, true);
print_r($arr);
Can anyone please help here?
Just try this code
<?php
$json2=
'{
"location": "westus",
"properties": {
"hardwareProfile": {
"vmSize": "Standard_D1_v2"
},
"storageProfile": {
"imageReference": {
"sku": "2016-Datacenter",
"publisher": "MicrosoftWindowsServer",
"version": "latest",
"offer": "WindowsServer"
},
"osDisk": {
"caching": "ReadWrite",
"managedDisk": {
"storageAccountType": "Standard_LRS"
},
"name": "myVMosdisk",
"createOption": "FromImage"
}
},
"networkProfile": {
"networkInterfaces": [
{
"id": "/subscriptions/{subscription-id}/resourceGroups/myResourceGroup/providers/Microsoft.Network/networkInterfaces/{existing-nic-name}",
"properties": {
"primary": true
}
}
]
},
"osProfile": {
"adminUsername": "{your-username}",
"computerName": "myVM",
"adminPassword": "{your-password}"
},
"diagnosticsProfile": {
"bootDiagnostics": {
"storageUri": "http://{existing-storage-account-name}.blob.core.windows.net",
"enabled": true
}
}
}
}';
$arr = json_decode($json2, true);
$arr['location'] = "eastus";
$arr['properties']['hardwareProfile']['vmSize'] = "Standard_D3_v2";
$arr['properties']['storageProfile']['imageReference']['sku'] = "20h1-evd";
$arr['properties']['storageProfile']['imageReference']['publisher'] = "MicrosoftWindowsDesktop";
$arr['properties']['storageProfile']['imageReference']['offer'] = "WindowsServer";
$updatedJson = json_encode($arr);
print_r($updatedJson);
First you need to try json_decode to make an array from this json file and then based on the array schema you need to find the property that you want and update it and then again use the json_encode to make an json

Finding State Short Name from JSON file with PHP

I have a JSON file that have all list of all the countries with their cities, and state. The file has this structure
"NO": {
"name": "Norway",
"states": {
"VA": {
"name": "Vest-Agder"
},
"RO": {
"name": "Rogaland"
},
"HO": {
"name": "Hordaland"
},
"SF": {
"name": "Sogn og Fjordane"
},
"MR": {
"name": "Møre og Romsdal"
},
"ST": {
"name": "Sør-Trøndelag"
},
"NO": {
"name": "Nord-Trøndelag"
},
"NT": {
"name": "Nordland"
},
"TR": {
"name": "Troms"
},
"FI": {
"name": "Finnmark"
},
"SJ": {
"name": "Svalbard"
},
"SJ": {
"name": "Jan Mayen"
},
"AK": {
"name": "Akershus"
},
"AA": {
"name": "Aust-Agder"
},
"BU": {
"name": "Buskerud"
},
"HE": {
"name": "Hedmark"
},
"OP": {
"name": "Oppland"
},
"OS": {
"name": "Oslo"
},
"TE": {
"name": "Telemark"
},
"VF": {
"name": "Vestfold"
},
"OF": {
"name": "Østfold"
}
}
},
What I am trying to achieve is to get the short name of state when user input the full name in the input field. For example if they add "Oslo" I will get "OS" in output
This is the code that I came up with but I am not getting the output.
$jsonitem = file_get_contents("countries-info.json");
$objitems = json_decode($jsonitem);
$findByname = function($name) use ($objitems) {
foreach ($objitems as $friend) {
if ($friend->name == $name) return $friend->state;
}
return false;
};
echo $findByname($_GET[code]) ?: 'No record found.';
Need advise.
Looking at the structure of your JSON you should loop $objitems->NO->states ( $objitems will contain the complete object, you only want the states)
So you need to change your foreach to:
foreach ($objitems->NO->states as $short => $state) {
if ($state->name == $name) return $short;
}
foreach ($objitems as $state => $friend) {
if ($friend->name == $name) return $state;
}

JSON Parsing Multi Level

How I can get text from below JSON.
https://jsfiddle.net/7h6a55m6/2/ JSON Data
Need to get "Testing","Testing2", etc. Stuck in multi level JSON style. Whats the easiest way to do
foreach ($response->data as $res) {
echo $res['comments'];
}
Use the json_decode().Something like below
$test_json='
{ "media":
{ "data":
[
{ "comments":
{ "data":
[
{ "text": "Testing", "id": "17935572247064063" },
{ "text": "Testing2", "id": "17909467621160083" },
{ "text": "Testing3", "id": "17879193508206704" },
{ "text": "Testing4", "id": "17936230114007492" },
{ "text": "Testing5", "id": "17861359981236880" },
{ "text": "Testing6", "id": "17932586956016890" },
{ "text": "Testing7", "id": "17920569544116678" },
{ "text": "Testing8", "id": "17933592700059204" }
]
}
}
]
}
}
';
$test_json=json_decode($test_json,true);
foreach($test_json['media']['data'][0]['comments']['data'] as $row){
print_r($row['text']);
}
try
$responseData = json_decode($response->data, true);
$result = $responseData['media']['data'][0]['comments']['data'];
foreach($result as $data) {
// do your stuff here
}

Finding key in array and return value in the same array

I have an array:
"city": [
{
"kind": "qpxexpress#cityData",
"code": "CHI",
"name": "Chicago"
},
{
"kind": "qpxexpress#cityData",
"code": "LAX",
"name": "Los Angeles"
},
{
"kind": "qpxexpress#cityData",
"code": "YMQ",
"name": "Montreal"
},
{
"kind": "qpxexpress#cityData",
"code": "YOW",
"name": "Ottawa"
},
{
"kind": "qpxexpress#cityData",
"code": "YVR",
"name": "Vancouver"
}
]
It's complete path is: array->trips->data->city
What I want to do is get the "name" from the array, if the "code" matches the code that is provided:
function getCity($string, $array) {
foreach ($array as $place) {
if (strstr($string, $place)) { // mine version
echo "Match found";
return true;
}
}
echo "Not found!";
return false;
}
This is all I have gotten. I have no idea how to continue.
The "array" that you have is indeed an array, but in JSON, and not a PHP-Array. Therefore, you have to decode it first:
$json = '[
{
"kind": "qpxexpress#cityData",
"code": "YOW",
"name": "Ottawa"
},
{
"kind": "qpxexpress#cityData",
"code": "YVR",
"name": "Vancouver"
}
]';
$array = json_decode($json, true);
Note here, that the "city": prefix in your code is probably a leftover from the surrounding object inside of that JSON (I also removed some of the entries, as not all of them are required to make my point). So in order to decode only the array it has to be removed.
You can then iterate over the array like you already do:
function getNameByCodeFromArray($array, $code) {
foreach ($array as $entry) {
if ($entry['code'] == $code) {
return $entry['name'];
}
}
}
And just call the function:
echo getNameByCodeFromArray($array, 'YVR'); // Echoes "Vancouver"

PHP JSON data foreach problem

I want to make a PHP JSON data foreach, but I met some problem. First: I can not get the properties part. Second it alawys show wrong in line: echo '<div class="image">...
Fatal error: Cannot use object of type stdClass as array in ...
This is the json data:
[
{
"post_id": "504464716_189878284371815",
"message": "\"Happy Birthday to You\" \"Happy Birthday to Mama\"",
"attachment": {
"media": [
{
"href": "http:\/\/www.facebook.com\/photo.php?fbid=493710409716&set=a.453260184716.254996.504464716",
"alt": "",
"type": "photo",
"src": "http:\/\/photos-f.ak.fbcdn.net\/hphotos-ak-snc4\/hs049.snc4\/34793_493710409716_504464716_5821684_2056840_s.jpg",
"photo": {
"aid": "2166659457206182932",
"pid": "2166659457211749620",
"owner": 504464716,
"index": 24,
"width": 225,
"height": 225
}
}
],
"name": "Wall Photos",
"href": "http:\/\/www.facebook.com\/album.php?aid=254996&id=504464716",
"caption": "\"Happy Birthday to You\" \"Happy Birthday to Mama\"",
"description": "",
"properties": [
{
"name": "By",
"text": "Suman Acharya",
"href": "http:\/\/www.facebook.com\/profile.php?id=504464716"
}
],
"icon": "http:\/\/static.ak.fbcdn.net\/rsrc.php\/yD\/r\/aS8ecmYRys0.gif",
"fb_object_type": "album",
"fb_object_id": "2166659457206182932"
},
"action_links": null,
"privacy": {
"value": ""
}
},
...
]
Here is my php code:
foreach ($data as $result) {
echo '<div class="title">'.htmlspecialchars($result->message).'<br />'.htmlspecialchars($result->description).'<br />'.htmlspecialchars($result->caption).'<br />';
if(!empty($result->attachment->properties[0]->text)){
foreach ($result->attachment->properties[0] as $properties) {
echo htmlspecialchars($properties->name).'<br />'.htmlspecialchars($properties->text).'</div>';
}
}
if(!empty($result->attachment->media)){
echo '<div class="image"><img src="'.htmlspecialchars($result->attachment->media[0]->src).'" /><br>'.htmlspecialchars($result->attachment->media[0]->type).'</div>';
}
}
If i were you i would just force the decoding to an assoc array by true as the second arg to json_decode. If you cant or dont want to do that then try accessing it like this:
$result->attachment->media->{0}->href
Use json_decode($the_data, true); instead of json_decode($the_data); that way it will return you an associative array instead of a StdClass.

Categories