I’m trying to filter and later access to the child data of a nested json file using PHP but for now i’m unable to do it.
Json example:
{ "_embedded": { "items": [ { "uuid": "zL7j58B5fC3", "dns_records": [ { "type": "TXT", "name": "_amazonses1.test.com" }, { "type": "TXT", "name": "_ddplatform1.test.com" } ] }, { "uuid": "Zf6Yr2n07", "dns_records": [ { "type": "TXT", "name": "_amazonses2.test.com", }, { "type": "TXT", "name": "_ddplatform2.test.com" } ], } ] } }
I’ve tried with this code:
$data = json_decode($resp, true); if( ! empty( $data ) ) { foreach($data['_embedded']['items'] as $item){ if($item['uuid'] == $domain_id){ $dns_entries=$item['uuid']['dns_records']['name']; } else { $dns_entries = ''; } echo $dns_entries; }
So $domain_id is an external value that I passed through the function. The idea is that if it matches one of the child’s values, then I can extract the values inside that child.
If I pass $domain_id as Zf6Yr2n07 then I need to extract the TXT information (name) inside that child node. e.g. _amazonses2.test.com
Any tip will be highly appreciated.
Advertisement
Answer
First, your JSON is invalid. Make sure to remove trailing commas.
Second, you’re accessing $item["uuid"]["dns_records"]["name"]
, but
dns_records
is an arraydns_records
exists on$item
, not$item["uuid"]
To get only the first name, just select the first element inside the dns_records
array: $item["dns_records"][0]["name"]
Another option is to return an array with all the available names by looping through all child elements of dns_records
and pushing the name
to a new array:
if( ! empty( $data ) ) { $dns_entries = []; foreach($data['_embedded']['items'] as $item){ if($item['uuid'] == $domain_id){ foreach($item['dns_records'] as $dns_item) { $dns_entries[] = $dns_item["name"]; } } } print_r($dns_entries); // print_r because echo doesn't work with arrays }