json_decode: can't get foreach to work - php
I'm losing my sight on this.. I can't find a solution and I keep ranting :P
I'm using the Movie Database to get a JSON with some info about a movie. Here's my code:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.themoviedb.org/3/movie/tt1327773/images?api_key=MY_API_KEY");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Accept: application/json"
));
$response = curl_exec($ch);
curl_close($ch);
$posters = json_decode($response, true);
foreach ($posters as $poster) {
$locandina = $poster[0]->posters->file_path;
echo $locandina;
}
?>
Of course print_r($response); works and it prints the array. What doesn't work is the foreach.. I can't get the file_path values. I keep getting Trying to get property of non-object even though I added a , true in the json_decode arguments! Here's the array:
[id] => 132363
[backdrops] => Array (
[0] => stdClass Object (
[aspect_ratio] => 1.78
[file_path] => /zZggWJSG18wPIOrZOgV5LI12LMi.jpg
[height] => 1080
[iso_639_1] =>
[vote_average] => 5.3846153846154
[vote_count] => 2
[width] => 1920
)
[1] => stdClass Object (
[aspect_ratio] => 1.78
[file_path] => /wYuFRYTfx5rVjyhqdf8MXdQzKAo.jpg
[height] => 1080
[iso_639_1] =>
[vote_average] => 5.3479853479854
[vote_count] => 2
[width] => 1920
)
...
)
to have access to file_path you need this array access key: $array["backdrops"][0]["file_path"] -> because it is contained in the first position of an non-associative array as the value of "backdrops"... check it out (;
source code:
// this is your input data
$json = '{"id":132363,"backdrops":[{"aspect_ratio":1.78,"file_path":"/zZggWJSG18wPIOrZOgV5LI12LMi.jpg","height":1080,"iso_639_1":null,"vote_average":5.38461538461539,"vote_count":2,"width":1920},{"aspect_ratio":1.78,"file_path":"/wYuFRYTfx5rVjyhqdf8MXdQzKAo.jpg","height":1080,"iso_639_1":null,"vote_average":5.34798534798535,"vote_count":2,"width":1920},{"aspect_ratio":1.78,"file_path":"/txiDfzC43eynxEchHfuZ1xTGfET.jpg","height":1080,"iso_639_1":null,"vote_average":5.34065934065934,"vote_count":2,"width":1920},{"aspect_ratio":1.78,"file_path":"/56jBImSOTXDk77tJ15eDscmM1BO.jpg","height":720,"iso_639_1":null,"vote_average":5.33910533910534,"vote_count":3,"width":1280},{"aspect_ratio":1.78,"file_path":"/b2Ki6hHtAXPIx84mGWM5hkaUXYC.jpg","height":720,"iso_639_1":null,"vote_average":5.2967032967033,"vote_count":2,"width":1280},{"aspect_ratio":1.78,"file_path":"/v765i6Y5oHXKRtQmiTasbs59G6g.jpg","height":720,"iso_639_1":null,"vote_average":5.2967032967033,"vote_count":2,"width":1280},{"aspect_ratio":1.78,"file_path":"/9utSv4T39V70iM1tGPb16HItFZ2.jpg","height":1080,"iso_639_1":null,"vote_average":5.2967032967033,"vote_count":2,"width":1920},{"aspect_ratio":1.78,"file_path":"/fnjBO2DKXOwHVMz4Tpjlf0DAm2F.jpg","height":1080,"iso_639_1":null,"vote_average":5.27472527472527,"vote_count":2,"width":1920},{"aspect_ratio":1.78,"file_path":"/4Ns5u0zZvOvD6FmXCLMsokBF8tO.jpg","height":2160,"iso_639_1":null,"vote_average":5.26041666666667,"vote_count":1,"width":3840},{"aspect_ratio":1.78,"file_path":"/5ioO0UWgnSFO1ESTlci4tvtfO0w.jpg","height":2160,"iso_639_1":null,"vote_average":5.24553571428571,"vote_count":1,"width":3840},{"aspect_ratio":1.78,"file_path":"/6pEA2GiB4rxLLQqoqLKTmJ2bkmk.jpg","height":1080,"iso_639_1":null,"vote_average":5.24542124542125,"vote_count":2,"width":1920},{"aspect_ratio":1.78,"file_path":"/2OJ8l1qsk7KvVO4xdtQ7kDsoInE.jpg","height":2160,"iso_639_1":null,"vote_average":5.23809523809524,"vote_count":1,"width":3840},{"aspect_ratio":1.78,"file_path":"/fFsZzecwN2yTBOPqyQnpQS3lrEh.jpg","height":720,"iso_639_1":null,"vote_average":5.23088023088023,"vote_count":3,"width":1280}],"posters":[{"aspect_ratio":0.67,"file_path":"/a2dAFXwnrRu1kJ95Tp7fI0axyYv.jpg","height":2100,"id":"52d6fdf619c2952d2c048af0","iso_639_1":"de","vote_average":5.41847041847042,"vote_count":3,"width":1400},{"aspect_ratio":0.67,"file_path":"/hUjEYTN5NuK8kYRQxngS7itpBQC.jpg","height":2100,"id":"52b9a79e760ee302e50e0957","iso_639_1":"en","vote_average":5.38992408557626,"vote_count":6,"width":1400},{"aspect_ratio":0.71,"file_path":"/3WuXELbV6MKqqDuOSVcJFFCqiTn.jpg","height":2161,"id":"531fb9259251411f8500067e","iso_639_1":"cs","vote_average":5.3125,"vote_count":1,"width":1529},{"aspect_ratio":0.7,"file_path":"/gkq46U0Cd8zZVfXHsrpCe81xsSH.jpg","height":1500,"id":"53b1277d0e0a26598900797d","iso_639_1":"it","vote_average":5.3125,"vote_count":1,"width":1050},{"aspect_ratio":0.67,"file_path":"/jcyTM8XGonYaKdnvXDZ1hFyzQt6.jpg","height":1024,"id":"51c061f4760ee306480c6370","iso_639_1":"en","vote_average":5.28138528138528,"vote_count":3,"width":690},{"aspect_ratio":0.67,"file_path":"/qx7VAo0aJwH6t17YgGvHe9eP61m.jpg","height":2100,"id":"52be5e01760ee359630bcba1","iso_639_1":"pt","vote_average":5.27529761904762,"vote_count":1,"width":1400},{"aspect_ratio":0.75,"file_path":"/43qeAVpny8rVFW0hprgIFOByO3E.jpg","height":2060,"id":"5231f2ed19c2950c0d03d534","iso_639_1":"fr","vote_average":5.27417027417027,"vote_count":3,"width":1545},{"aspect_ratio":0.7,"file_path":"/b91OJaB9llSUZXc7C8Rtr56e3ws.jpg","height":1139,"id":"530da421c3a3685bf4002347","iso_639_1":"da","vote_average":5.26785714285714,"vote_count":1,"width":800},{"aspect_ratio":0.67,"file_path":"/gBLjprwQ4Re83qF3s5wR17pmQuI.jpg","height":1202,"id":"520b7e0119c2955c22062095","iso_639_1":"en","vote_average":5.26418786692759,"vote_count":10,"width":811},{"aspect_ratio":0.7,"file_path":"/jIFNhNpoZQja02uVudJr4dRzat9.jpg","height":2806,"id":"52b54ad9760ee34c2d0ced9a","iso_639_1":"ro","vote_average":5.26041666666667,"vote_count":1,"width":1956},{"aspect_ratio":0.75,"file_path":"/fR5D7pvKlvdkYf5pjg5v62QA9VY.jpg","height":3778,"id":"52315424760ee370e8179f24","iso_639_1":"fr","vote_average":5.24542124542125,"vote_count":2,"width":2833},{"aspect_ratio":0.71,"file_path":"/zU0FQydIMqusfC7dRD1gJojG07v.jpg","height":1980,"id":"52f23c4ec3a3687dfe0838ed","iso_639_1":"de","vote_average":5.24542124542125,"vote_count":2,"width":1400},{"aspect_ratio":0.67,"file_path":"/ahK6dhq7yVx1O6P8rVnSApurwOR.jpg","height":1200,"id":"52daccf3760ee36893077851","iso_639_1":"it","vote_average":5.17113095238095,"vote_count":1,"width":800},{"aspect_ratio":0.67,"file_path":"/xPwpuwNQVDh7PCQoyct0Fh4kdYn.jpg","height":2100,"id":"52555c11760ee31fbe0727d5","iso_639_1":"en","vote_average":5.14157014157014,"vote_count":11,"width":1400},{"aspect_ratio":0.67,"file_path":"/wLJpmGFzfn5YDCn3ZTO7WgZRpr4.jpg","height":1897,"id":"51ad01df19c295440007504c","iso_639_1":"en","vote_average":5.13227513227513,"vote_count":9,"width":1280},{"aspect_ratio":0.67,"file_path":"/nEx0vsj0WbXuuej0YJYXZaLtIwU.jpg","height":2100,"id":"52b9a79f760ee319b820b08b","iso_639_1":"en","vote_average":5.11204481792717,"vote_count":5,"width":1400},{"aspect_ratio":0.67,"file_path":"/5Iia0rSQXLPSz4Dnksn6OTgTFGX.jpg","height":1500,"id":"535b80d2c3a36830b00010f5","iso_639_1":"hu","vote_average":0.0,"vote_count":0,"width":1000},{"aspect_ratio":0.69,"file_path":"/mMlG2cFr3za21lKkbu2XpitwtGT.jpg","height":800,"id":"52b4058d760ee3576d02b06c","iso_639_1":"el","vote_average":0.0,"vote_count":0,"width":554},{"aspect_ratio":0.69,"file_path":"/cHux0aJqxxvMT6MgVnMaLMXxnwz.jpg","height":2882,"id":"52bdff9019c2955ab21272f5","iso_639_1":"pl","vote_average":0.0,"vote_count":0,"width":2000},{"aspect_ratio":0.68,"file_path":"/p14JxT0fzvbeOv9fCAI67x0wuQ5.jpg","height":1469,"id":"52be5e01760ee37070015c47","iso_639_1":"pt","vote_average":0.0,"vote_count":0,"width":1000},{"aspect_ratio":0.7,"file_path":"/heF6qrZDSrTbfFs0mRlj9imJJKN.jpg","height":1428,"id":"52f103f919c295253e05d5a2","iso_639_1":"es","vote_average":0.0,"vote_count":0,"width":1000},{"aspect_ratio":0.69,"file_path":"/rcA5RpSJI2cHSgnppvI3locslbY.jpg","height":2048,"id":"53a13c29c3a3687bbc001b22","iso_639_1":"tr","vote_average":0.0,"vote_count":0,"width":1421},{"aspect_ratio":0.7,"file_path":"/iB101OMznrVlyGq84f4jwg49VVF.jpg","height":966,"id":"53be4b3ac3a3687e59002922","iso_639_1":"ko","vote_average":0.0,"vote_count":0,"width":678}]}';
// convert it to an array enabling the second parameter (associative array)
$array = json_decode($json, true);
// this is the whole array
var_dump($array);
// this is the key you need to get
var_dump($array["backdrops"][0]["file_path"]);
// which is similar to (the internal pointer points to the first element):
$sub_array = current($array["backdrops"]);
var_dump($sub_array["file_path"]);
Related
Getting an XML file in a .asp URL
I need to grab XML data from an .asp URL and cannot figure out where it goes wrong. Tried: <?php $url = "http://bookings.emperordivers.com/webScheduleSpecificXML_all.asp"; $feed = file_get_contents($url); $xml = simplexml_load_string($feed); // Display the first post title echo $xml->Schedules->Schedule[0]->Boat; I hoped this would work, but suspected that the .asp URL is blocking somehow so alternatively tried: function get_data($url) { $ch = curl_init(); $timeout = 5; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $data = curl_exec($ch); curl_close($ch); return $data; } $returned_content = get_data('http://bookings.emperordivers.com/webScheduleSpecificXML_all.asp'); $xml = simplexml_load_string($returned_content); // Display the first post title echo $xml->Schedules->Schedule[0]->Boat; In both case a beautiful white screen. Is there a simple trick to get this working?
Your not accessing it correctly: echo $xml->Schedule[0]->Boat; The format is: SimpleXMLElement Object ( [Schedule] => Array ( [0] => SimpleXMLElement Object ( [Start] => 2017-09-24 [Duration] => 7 [Boat] => MV Emperor Orion [Itinerary] => Best of Maldives [Dep-Arr] => Male [Spaces] => 4 [Rates] => SimpleXMLElement Object ( [Rate] => Array ( [0] => 1149 [1] => 1,057.08 [2] => 1,367.31 ) ) ) ...
How to get json decode array value using PHP
I need one help.I need to get the json decode value inside foreach loop using PHP. I am explaining my code below. $user_qry = "http://oditek.in/takeme/webservice/user2/user_ride_list_v2.php"; $pstflds="mobile=".$mobile; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $user_qry); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $pstflds); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response=curl_exec ($ch); $data=json_decode($response,true); $bikeArr=$data->data; print_r($bikeArr);exit; Its giving the output like below. Array ( [0] => stdClass Object ( [book_id] => 161117193881 [booking_status] => 4 [book_date] => 17-11-2016 [book_time] => 07:38 PM ) [1] => stdClass Object ( [book_id] => 161116183564 [booking_status] => 4 [book_date] => 16-11-2016 [book_time] => 06:35 PM ) ) I need to iterate the above array in foreach loop and get the data.Please help me.
json_decode parameter 2 is assoc When TRUE, returned objects will be converted into associative arrays. default is false reference http://php.net/manual/en/function.json-decode.php json_decode($response, true);
try $data=json_decode($response,true); and youll get assoc array instead of object
Can you try this and see if you get any errors? foreach($bokeArr as $bike){ echo 'book id = ' . $bike->book_id; }
Searching in json array for parameter and show correct information
Is it possible to search inside json array which I pull with curl and if match to show only that data? The array looks like Array ( [status] => success [data] => Array ( [out] => Array ( [0] => Array ( [address] => test address [amount] => 11 [type] => 1 ) [1] => Array ( [address] => test address 1 [is_nonstandard] => [amount] => 12 [type] => 1 ) ) ) [code] => 200 [message] => ) And this is how I pull the array function get_curl_content_tx($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, false); $result = curl_exec($curl); curl_close($curl); return $result; } $url=get_curl_content_tx("http://example.com"); $total =json_decode($url,true); So since there can be more that 1 arrays in [out] => Array as current situation they are two I want to search and match by [address] and when match to give data.
Here is a way to do it : foreach($arr['data']['out'] as $d){ if(strpos($d['address'], 'testaddress') !== false){ //do something var_dump($d); } } You need to replace var_dump by whatever you want to do. I used strpos for the sake of this example, but you might want to use a custom method that would suits your needs better Hope this helps.
<?php $outArray = $total['data']['out']; foreach($outArray as $item) { // echo $item['address']; } ?>
Try this: if(isset($total['data']['out'])){ foreach($total['data']['out'] as $out){ if(isset($out['address'])){ if($out['address'] == "your adress"){ //Your Stuff; } } } }
How to get data from an array inside json data php
I have the following array of json data. When I try to loop using a for each, php gives me the error "Object of class stdClass could not be converted to string". I want to access the nameserver in the authns array, and the soa array. How do I go about doing that? stdClass Object ( [error] => [domain] => whoisdoma.net [ip_address] => 108.162.199.120 [authns] => stdClass Object ( [nameserver] => uma.ns.cloudflare.com [ip] => 173.245.58.146 [location] => San Francisco ) [soa] => stdClass Object ( [nameserver] => tom.ns.cloudflare.com [email] => dns.cloudflare.com [serial] => 2015505396 [refresh] => 10000 [retry] => 2400 [expiry] => 604800 [minimum] => 3600 ) ) This is the code I'm using to get the data: <?php $domain = $_GET['domain']; //set the url $url = "http://api.site.ga/v1/dns/lookup?domain=".$domain; //start a curl session $ch = curl_init(); $timeout = 5; //set curl options curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); //get the data $data = curl_exec($ch); //decode the data $jsonData = json_decode($data); //close the curl session curl_close($ch); ?> This is the for each loop I'm using <?php foreach($jsonData->authns as $authns) { echo $authns->nameserver; } ?>
You need to decode the json object using an associative array. Here is an exmaple: $data = json_decode(file_get_contents('http://api.domain.com/call'), true); $data is now an associative array.
You are looping through authns while it is an object by itself. So your nameserver which you want is actually $authns in its first iteration. Just access it like $jsonData->authns->nameserver try this for yourself foreach($jsonData->authns as $authns) { echo $authns; }
Post multidimensional array using CURL and get the result on server
I am sending data from my local machine to server using CURL. And the data is multidimensional array. Array ( [0] => stdClass Object ( [id] => 1 ) [1] => stdClass Object ( [id] => 0 ) [2] => stdClass Object ( [id] => 11 ) ) I am using this below code for sending the data. $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_VERBOSE, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_URL, "my_url"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $array); // $array is my above data But at server when I try to put this incoming data to file or just print_r it gives me this below output Array ( [0] => Array [1] => Array [2] => Array ) But I want the output in multidimensional. I tried with print_r($_POST[0]) but it gives only Array text.
cURL can only accept a simple key-value paired array where the values are strings, it can't take an array like yours which is an array of objects. However it does accept a ready made string of POST data, so you can build the string yourself and pass that instead: $str = http_build_query($array); ... curl_setopt($ch, CURLOPT_POSTFIELDS, $str); A print_r($_POST) on the receiving end will show: Array ( [0] => Array ( [id] => 1 ) [1] => Array ( [id] => 0 ) [2] => Array ( [id] => 11 ) )
I would give a go to serialize and unserialize: 1) Before sending your array, serialize it (and set your transfer mode to binary): (...) curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); // need this to post serialized data curl_setopt($ch, CURLOPT_POSTFIELDS, serialize($array)); // $array is my above data 2) When you receive the data, unserialize it: $array = unserialize($_POST); More details here and here
$param['sub_array'] = json_encode($sub_array); and on the other side $sub_array= json_decode($_POST['sub_array']);