1

First of all, let me tell you that I am new to PHP and I have searched to learn what I am trying to do but could not find any solution, that is why I am posting here. My question may seem very simple to an expert developer but since its a helping platform and people post their issues according to their expertise, so I am too. If it hurts any expert programmers EGO, please do not close because any kind programmer can see and help me. Thanks

I have a JSON array which has multiple records which is

{"status": "ok", "items": [{"fullname": ["John Doe"], "current_street": "458 moh Hl Z,Jnm, MK M228", "previous_addresses": ["JHt Park Mn, VLK KOL, IU B581", "000 BVH L #5P,BGH, PL3 J210"], "cellphones": ["(000) 000-0001", "(000) 000-0002", "(000) 000-0003", "(000) 000-0004", "(000) 000-0005"], "landlines": [], "emails": [], "url": "https://www.example.com/JN1"}, {"fullname": ["John Doe 2"], "current_street": "000 BVH L #5P,BGH, PL J210", "previous_addresses": ["000 BVH L #5P,BGH, PL1 J210", "000 BVH L #5P,BGH, PL2 J210", "000 BVH L #5P,BGH, PL3 J210", "000 BVH L #5P,BGH, PL4 J210", "000 BVH L #5P,BGH, PL5 J210", "000 BVH L #5P,BGH, PL5 J210", "000 BVH L #5P,BGH, PL6 J210"], "cellphones": [], "landlines": ["(000) 000-0001", "(000) 000-0002", "(000) 000-0003", "(000) 000-0004", "(000) 000-0005"], "emails": ["[email protected]", "[email protected]"], "url": "https://www.example.com/JD3"}], "items_dropped": [], "stats": {"crawlera/delay/reset_backoff": 10, "crawlera/request": 10, "crawlera/request/method/GET": 10, "crawlera/response": 10, "crawlera/response/status/200": 10, "downloader/request_bytes": 5500, "downloader/request_count": 10, "downloader/request_method_count/GET": 10, "downloader/response_bytes": 81243, "downloader/response_count": 10, "downloader/response_status_count/200": 10, "elapsed_time_seconds": 3.511176, "finish_reason": "finished", "finish_time": "2020-05-11 18:56:49", "item_scraped_count": 9, "log_count/DEBUG": 19, "log_count/INFO": 12, "memusage/max": 66445312, "memusage/startup": 66445312, "request_depth_max": 1, "response_received_count": 10, "scheduler/dequeued": 10, "scheduler/dequeued/memory": 10, "scheduler/enqueued": 10, "scheduler/enqueued/memory": 10, "start_time": "2020-05-11 18:56:46"}, "spider_name": "friendsearch"}

I need to loop through them to echo each record in PHP in a way that a record can have multiple values of current_address, cellphone, landlines with in them.

For this based on my serach and study, I have tried with

$outputDetails = '{"status": "ok", "items": [{"fullname": ["John Doe"], "current_street": "458 moh Hl Z,Jnm, MK M228", "previous_addresses": ["JHt Park Mn, VLK KOL, IU B581", "000 BVH L #5P,BGH, PL3 J210"], "cellphones": ["(000) 000-0001", "(000) 000-0002", "(000) 000-0003", "(000) 000-0004", "(000) 000-0005"], "landlines": [], "emails": [], "url": "https://www.example.com/JN1"}, {"fullname": ["John Doe 2"], "current_street": "000 BVH L #5P,BGH, PL J210", "previous_addresses": ["000 BVH L #5P,BGH, PL1 J210", "000 BVH L #5P,BGH, PL2 J210", "000 BVH L #5P,BGH, PL3 J210", "000 BVH L #5P,BGH, PL4 J210", "000 BVH L #5P,BGH, PL5 J210", "000 BVH L #5P,BGH, PL5 J210", "000 BVH L #5P,BGH, PL6 J210"], "cellphones": [], "landlines": ["(000) 000-0001", "(000) 000-0002", "(000) 000-0003", "(000) 000-0004", "(000) 000-0005"], "emails": ["[email protected]", "[email protected]"], "url": "https://www.example.com/JD3"}], "items_dropped": [], "stats": {"crawlera/delay/reset_backoff": 10, "crawlera/request": 10, "crawlera/request/method/GET": 10, "crawlera/response": 10, "crawlera/response/status/200": 10, "downloader/request_bytes": 5500, "downloader/request_count": 10, "downloader/request_method_count/GET": 10, "downloader/response_bytes": 81243, "downloader/response_count": 10, "downloader/response_status_count/200": 10, "elapsed_time_seconds": 3.511176, "finish_reason": "finished", "finish_time": "2020-05-11 18:56:49", "item_scraped_count": 9, "log_count/DEBUG": 19, "log_count/INFO": 12, "memusage/max": 66445312, "memusage/startup": 66445312, "request_depth_max": 1, "response_received_count": 10, "scheduler/dequeued": 10, "scheduler/dequeued/memory": 10, "scheduler/enqueued": 10, "scheduler/enqueued/memory": 10, "start_time": "2020-05-11 18:56:46"}, "spider_name": "friendsearch"}';
$output = json_decode($outputDetails);

foreach ($output->items as $item){
  echo "Name: ".$item->fullname;
  echo "<br>";
}

But it is showing me below result:

Name: Array
Name: Array

And what I am looking to achieve is something like:

Name: John Doe
Current Address: 458 moh Hl Z,Jnm, MK M228
Previous Addresses: JHt Park Mn, VLK KOL, IU B581, 000 BVH L #5P,BGH, PL3 J210

Name: John Doe 2
Current Address: 000 BVH L #5P,BGH, PL J210
Previous Addresses: 000 BVH L #5P,BGH, PL1 J210, 000 BVH L #5P,BGH, PL2 J210, 000 BVH L #5P,BGH, PL3 J210, 000 BVH L #5P,BGH, PL4 J210, 000 BVH L #5P,BGH, PL5 J210, 000 BVH L #5P,BGH, PL5 J210, 000 BVH L #5P,BGH, PL6 J210

So, first I want to loop to show the each record, then loop to show their individual attributes. Any help on it? Thanks

2 Answers 2

1

The way that you have structured your JSON isn't quite right. You've defined fullname as an array by wrapping the string in square brackets. Instead of ["John Doe"], just use "John Doe". That will allow you to return the name using $item->fullname.

If you want to display values from different levels of a nested array, you will need to create a loop at each level of the structure.

Your foreach below only accesses the first level of the array.

foreach ($output->items as $item){
  echo "Name: ".$item->fullname;
  echo "<br>";
}

If you want to loop through the values in an array (as per your question), add another foreach statement inside:

foreach ($output->items as $item){
    echo "Current Address: " . $item->current_street;
    echo "Previous Addresses: ";
    foreach($item->previous_addresses as $address){
        echo $address;
    }
}

The second foreach is overkill in this instance, and you could display the array as a string by using implode, like this:

echo implode(",", $item->previous_addresses);

Have a look at https://jsonlint.com/ for formatting JSON to make it more readable. Also, there's a plugin for Chrome called JSONView, which helps to see output in the browser if you're working with an API.

Sign up to request clarification or add additional context in comments.

3 Comments

Thanks for the correction. Is it possible to change JSON structure at PHP end after getting it?
Yes, but I'm not quite sure what you want to change. You can use json_encode to turn variables in to JSON. How is $outputDetails produced?
Now, I know that why I was getting ARRAY as a result when I echo fullname because it was an array. Thank you again for making complex thing for me understood in a simple way.
1

In your json you have

items":[
{
"fullname":[
"John Doe"
],

And it should be

items":[
{
"fullname":"John Doe",

Or

echo "Name: ".$item->fullname[0];

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.