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"]);
For example a request like
$request = new FacebookRequest($session, 'GET','/me/accounts?fields=id,name,access_token');
$response = $request->execute();
$arrayResult = $response->getGraphObject()->asArray();
print_r($arrayResult);
returns
Array (
[data] => Array (
[0] => stdClass Object (
[id] => 01010011100001111000111 #it's a fake id
[name] => MyAwesomePageName #And a fake name
)
)
[paging] => stdClass Object (
[next] => https://graph.facebook.com/v2.0/01010011100001111000111/accounts?fields=id,name&access_token=RanDoMAndFaaKKeEACCessToKen&limit=5000&offset=5000&__after_id=enc_IdOnOTKnoWWhAtThiSIs
)
)
Thats is.
I would like to retrieve all the response in array and without theses stdClass objects.
Just like it was in the previous version of their api.
Thanks.
An easier way might be to grab the raw JSON from the $response and decode it yourself:
$request = new FacebookRequest($session, 'GET', '/me/accounts?fields=id,name,access_token');
$response = $request->execute();
$array = json_decode($response->getRawResponse(), true);
print_r($array);
Update
As of PHP SDK 5.0+ you can use getDecodedBody() on the FacebookResponse object (this does the JSON decoding for you and returns an array).
$fb = new Facebook([...]);
$response = $fb->get('/me', '{access-token}');
$array = $response->getDecodedBody();
The Facebook SDK's asArray() method is limited as you've discovered. However, you can manually convert an object to an array using the get_object_vars( $object ); function. In your example, you can do something like:
$array = get_object_vars( $arrayResult['data'][0] );
This will convert the page Object into an array. The function isn't recursive, so you'll need to convert each object to an array.
You can use a recursive function like this:
function object_to_array($obj) {
$arr = array();
if($obj instanceOf GraphObject){
if(is_scalar($obj->asArray()) )
$arr = $obj->asArray();
else{
foreach ($obj->getPropertyNames() as $propName) {
$arr[$propName] = object_to_array($obj->getProperty($propName));
}
}
}else if(is_array($obj)){
foreach ($obj as $propKey => $propValue) {
$arr[$propKey] = object_to_array($obj[$propValue]);
}
}else $arr = $obj;
return $arr;
}
Just use json_decode($arrayResult) to get the JSON output. The output you are getting is simply a php data structure.
We can simply do json_encode and decode as an Array
$arrayResult = json_decode(json_encode($appreq['data'][0]),true);
sample output
Array
(
[application] => Array
(
[name] => Test App
[namespace] => app-test-app
[id] => 988798798798
)
[created_time] => 2015-02-17T08:42:14+0000
[data] => action=acceptit
[from] => Array
(
[id] => 987989798
[name] => TestUser
)
[message] => I have sent 1 Request
[to] => Array
(
[id] => 98098090
[name] => NameAjax
)
[id] => 345423452345_34523452453
)
I'm using the tumblr API and the following code:
$var = xhttp::toQueryArray($response['body']);
print_r($var);
This print on the screen the following:
Array ( [{"meta":{"status":200,"msg":"OK"},"response":{"user":{"name":"lukebream","likes":0,"following":8,"default_post_format":"html","blogs":[{"name":"lukebream","url":"http:\/\/lukebream.tumblr.com\/","followers":5,"primary":true,"title":"Untitled","admin":true,"queue":0,"ask":false,"tweet":"N"}]}}}] => )
How can I access the individual elements and assign them to variables?
Here is what I have finished with:
$tumblr->set_token($_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
$data = array();
$data['post'] = array();
$response = $tumblr->fetch('http://api.tumblr.com/v2/user/info', $data);
if($response['successful']) {
echo $response['json']['response']['url'];
} else {
echo "api call failed. {$response[body]}<br><br>";
}
It's called JSON, you can parse it using json_decode()
Usage Example :
//I used file_get_contents() to keep things simple
$jsonData = file_get_contents("http://api.tumblr.com/v2/blog/lukebream.tumblr.com/info?api_key=<api_key_here>");
The $jsonData contains :
{
"meta":{
"status":200,
"msg":"OK"
},
"response":{
"blog":{
"title":"Untitled",
"posts":61,
"name":"lukebream",
"url":"http:\/\/lukebream.tumblr.com\/",
"updated":1321830278,
"description":"",
"ask":false,
"likes":0
}
}
}
after it goes through json_decode(), we get a PHP object, so :
$obj = json_decode($jsonData);
will return :
stdClass Object
(
[meta] => stdClass Object
(
[status] => 200
[msg] => OK
)
[response] => stdClass Object
(
[blog] => stdClass Object
(
[title] => Untitled
[posts] => 61
[name] => lukebream
[url] => http://lukebream.tumblr.com/
[updated] => 1321830278
[description] =>
[ask] =>
[likes] => 0
)
)
)
Then you can access the data like with any other object.
You can also use json_decode($str, TRUE): this will return an ARRAY instead of an object, much easier to play with!