Fetching data error from json format - php

I have the following JSON format
Array (
[version] => 3
[status] => ok
[response] => Array (
[data] => Array (
[0] => Array (
[accessible_wheelchair] => 1
[address] => 200 5th Ave
[category_labels] => Array (
[0] => Array (
[0] => Social
[1] => Food and Dining
[2] => Restaurants
[3] => Italian
)
[1] => Array (
[0] => Social
[1] => Food and Dining
[2] => Restaurants
[3] => Steakhouses
)
[2] => Array (
[0] => Social
[1] => Entertainment
[2] => Music and Show Venues
)
)
[country] => us
)
)
[included_rows] => 20
)
)
I want to fetch the data from the data->[0] array.
I used the following code to insert the data into database
$newurl="/*the api link is here*/";
$json = file_get_contents($newurl);
$data = json_decode($json,true);
foreach($data as $value){
$value1=$value;//$value
foreach($value as $newValue){
foreach($newValue as $newValue1){
$name=$newValue1["name"];
$sql="insert into restaurant (name) values(".$name.");";
db_query($sql) or die("insert error");
}
}
}
But it cannot be able to insert the data.Please whether there is any other method to fetch the my desired data and store it in database.

where is restaurant name?
<?php
$newurl="/*the api link is here*/";
$json = file_get_contents($newurl);
if ($json)
{
if (!($response = json_decode(stripslashes($json), TRUE)))
{
die("invalid json format");
}
}
if (!empty($response['status']) && $response['status'] == "ok")
{
$data = $response['response']['data'];
for ($i=0; $i < count($data); $i++)
{
// in this step data 0 wich you want to extract
/*
[accessible_wheelchair] => 1
[address] => 200 5th Ave
[category_labels] => Array (
[0] => Array (
[0] => Social
[1] => Food and Dining
[2] => Restaurants
[3] => Italian
)
[1] => Array (
[0] => Social
[1] => Food and Dining
[2] => Restaurants
[3] => Steakhouses
)
[2] => Array (
[0] => Social
[1] => Entertainment
[2] => Music and Show Venues
)
)
*/
// but what i confused here is restaurant name? i don't see restaurant name here..
}
}

Related

Mailchimp JSON using PHP foreach with multiple keys

Im using Mailchimp API and getting their user activity. From the array, I have to GET the campaign_id = 1ce6d076f4 first and then match the Campaign ID to all arrays that has action = click so that I can get value of url. Here's the JSON array of the mailchimp.
Array
(
[0] => stdClass Object
(
[action] => click
[timestamp] => 2019-11-12T03:08:40+00:00
[url] => https://nasis.sb:8890/article/burlington-vermont-market-overview
[campaign_id] => 1ce6d076f4
[title] => Sample Campaign v2
)
[1] => stdClass Object
(
[action] => click
[timestamp] => 2019-11-12T02:54:07+00:00
[url] => https://nasis.sb:8890/property/walgreens-burlington-vermont?lid=*|HTML:LINKID|*
[campaign_id] => 1ce6d076f4
[title] => Sample Campaign v2
)
[2] => stdClass Object
(
[action] => open
[timestamp] => 2019-11-12T02:33:55+00:00
[campaign_id] => 1ce6d076f4
[title] => Sample Campaign v2
)
[3] => stdClass Object
(
[action] => sent
[timestamp] => 2019-11-12T02:33:40+00:00
[type] => regular
[campaign_id] => 1ce6d076f4
[title] => Sample Campaign v2
)
[4] => stdClass Object
(
[action] => open
[timestamp] => 2019-10-31T00:38:02+00:00
[campaign_id] => fbe8dfde89
[title] => Sample Campaign v1
)
[5] => stdClass Object
(
[action] => click
[timestamp] => 2019-10-31T00:15:44+00:00
[url] => https://nasis.sb:8890?lid=*|HTML:LINKID|*
[campaign_id] => fbe8dfde89
[title] => Sample Campaign v1
)
)
I am connecting the mailchimp api via wordpress plugin. And here's my code. However, nothing happen when trying to display the $x
$activityDetails = wp_remote_get( 'https://'.$dc.'.api.mailchimp.com/3.0/lists/'.$list_id.'/members/'.$subscriber_hash.'/activity', $args );
$body = json_decode( wp_remote_retrieve_body( $activityDetails ) );
// echo '<pre>'; print_r($body->activity); echo '</pre>';
foreach ( $body->activity as $act ) {
if ( $act->campaign_id == '1ce6d076f4' ) {
$x = $act->action;
}
}
echo '<p> Campaign ID: ' . $x . '</p>';
UPDATE
It looks like I got it to work...
foreach ( $body->activity as $act ) {
if ( $act->campaign_id == '1ce6d076f4' ) {
if ( $act->action == 'click' ) {
$x[] = $act->url;
}
}
}
echo '<pre>'; print_r($x); echo '</pre>';
// Output
Array
(
[0] => https://www.nasinvestmentsolutions.com/article/burlington-vermont-market-overview
[1] => https://nasis.sb:8890/property/walgreens-burlington-vermont?lid=*|HTML:LINKID|*
)

Removing parts of a multidimensional array that do not have a key that matches a separate array?

I have an array that is full of IDs that will match corresponding IDs in a separate array which is larger in terms of indices. I would like to first search through the larger array using the IDs from the smaller array and eliminate any indices that do not appear in the smaller array, and then place values present in the arrays that do match in my initial, smaller array. I have tried various nested for loops (come close, but does not get me there) but I can't seem to wrap my head about some array problems in general.
First array will look something like this:
Array
(
[0] => Array
(
[roleID] => 5b6468a500277c71b98405b1f140991c
[name] =>
[description] =>
[rate] =>
[hours] =>
[total] =>
)
[1] => Array
(
[roleID] => 5b6468a500277c74f6b2c065436b7d17
[name] =>
[description] =>
[rate] =>
[hours] =>
[total] =>
)
[2] => Array
(
[roleID] => 5b6468a500277c7697ba21928129e3af
[name] =>
[description] =>
[rate] =>
[hours] =>
[total] =>
)
)
Second array will look something like this
Array
(
[0] => stdClass Object
(
[ID] => 5b6468a500277c71b98405b1f140991c
[name] => CED
[objCode] => ROLE
[description] => CED
)
[1] => stdClass Object
(
[ID] => 5b6468a500277c74f6b2c065436b7d17
[name] => AD
[objCode] => ROLE
[description] => AD
)
[2] => stdClass Object
(
[ID] => 5b6468a500277c7697ba21928129e3af
[name] => AMG
[objCode] => ROLE
[description] => AMG
)
[3] => stdClass Object
(
[ID] => 5b6468a500277c77071c32c0bb2bae04
[name] => AP
[objCode] => ROLE
[description] => AP
)
[4] => stdClass Object
(
[ID] => 5b6468a500277c787e9680625c74ca80
[name] => AST
[objCode] => ROLE
[description] => AST
)
[5] => stdClass Object
(
[ID] => 5b6468a500277c79c0eddb8c14cc9f83
[name] => ASV
[objCode] => ROLE
[description] => ASV
)
)
I want to match the roleID in the first ID with the ID in the second array, then take the 'name' and 'description' keys and put it in the first array in the position it belongs. I have gotten close with the below code, but either a bunch of the arrays get misordered, or the 'name' and 'description' fields are the exact same for every index.
$projectUserRoleIDs = $client->get('project', $myProjectName, array('projectUserRoles:roleID'));
$projectUserRoleIDs = $projectUserRoleIDs->projectUserRoles;
$roleIDs = [];
for($a = 0; $a < count($projectUserRoleIDs); $a++)
{
$roleIDs[$a]['roleID'] = $projectUserRoleIDs[$a]->roleID;
// Get array of entire list of roles that are available in Workfront
// The roles:name category has all of the acronyms for each role, which can appear in an invoice
// The roles:description category has all of the full length names
$projectRoles = $client->get('project', $myProjectName, array('roles:name', 'roles:description'));
$projectRoles = $projectRoles->roles;
$roleLoop = [];
for($b = 0; $b < count($projectUserRoleIDs); $b++)
{
$roleLoop[] = $projectUserRoleIDs[$b]->roleID;
}
foreach($roleLoop as $key => $value) {
for($x = 0; $x<count($projectRoles); $x++)
{
if($projectRoles[$x]->ID === $value)
{
$name = $projectRoles[$x]->name;
$description = $projectRoles[$x]->description;
$roleIDs[$x]['name'] = $name;
$roleIDs[$x]['description'] = $description;
}
}
}
$roleIDs[$a]['rate'] = '';
$roleIDs[$a]['hours'] = '';
$roleIDs[$a]['total'] = '';
}
In the end I want my first array to look like this
Array
(
[0] => Array
(
[roleID] => 5b6468a500277c71b98405b1f140991c
[name] => CED
[description] => CED
[rate] =>
[hours] =>
[total] =>
)
[1] => Array
(
[roleID] => 5b6468a500277c74f6b2c065436b7d17
[name] => AD
[description] => AD
[rate] =>
[hours] =>
[total] =>
)
And so on... any help is appreciated and thank you.

json to csv conversion in php

i am getting a json response from a site,
then convert it into json decoded file, my code is
$author = $_POST['author_name'];
$author_name = str_replace(' ', '+', $author);
$term = $_POST['term'];
$term_search = str_replace(' ', '+', $term);
$country = $_POST['country'];
$entity = 'ebook';
$search_url = "https://itunes.apple.com/searchterm=".$term_search."&entity=".$entity."&country=".$country;
$data = file_get_contents($search_url);
$josn_decoded = json_decode($data, true);
$file_name = "searched_book.csv";
$fp = fopen($file_name, 'w');
foreach($josn_decoded['results'] as $search_result){
fputcsv($fp, $search_result);
}
fclose($fp);
the response of echo "<pre>"; print_r($josn_decoded) is like
<pre>Array
(
[resultCount] => 5
[results] => Array
(
[0] => Array
(
[artistId] => 673560392
[artistName] => Hanna Raskin
[kind] => ebook
[price] => 2.99
[description] => Yelp Help, written by professional food critic Hanna Raskin (Seattle Weekly, Dallas Observer).
[currency] => USD
[genres] => Array
(
[0] => Cookbooks, Food & Wine
[1] => Books
[2] => Computers & Internet
[3] => Internet
)
[genreIds] => Array
(
[0] => 9028
[1] => 38
[2] => 9027
[3] => 10020
)
[releaseDate] => 2013-07-06T07:00:00Z
[trackId] => 673560390
[trackName] => Yelp Help: How to Write Great Online Restaurant Reviews
[formattedPrice] => $2.99
[artistIds] => Array
(
[0] => 673560392
)
[artworkUrl60] => http://a2.mzstatic.com/us/r30/Publication/v4/30/fa/89/30fa8929-ba32-41fd-c046-bb660b2c886c/9781301327515.60x60-50.jpg
[artistViewUrl] => https://itunes.apple.com/us/artist/hanna-raskin/id673560392?mt=11&uo=4
[trackCensoredName] => Yelp Help: How to Write Great Online Restaurant Reviews
[fileSizeBytes] => 219793
[artworkUrl100] => http://a5.mzstatic.com/us/r30/Publication/v4/30/fa/89/30fa8929-ba32-41fd-c046-bb660b2c886c/9781301327515.100x100-75.jpg
[trackViewUrl] => https://itunes.apple.com/us/book/yelp-help-how-to-write-great/id673560390?mt=11&uo=4
)
[1] => Array
(
[artistId] => 413390948
[artistName] => Gradiva Couzin & Jennifer Grappone
[kind] => ebook
[price] => 1.99
[description] => While most businesses know the importance of online reviews on sites such as Yelp.com, they have no clue how to grab the reins and help shape the conversation around their service or product.
[currency] => USD
[genres] => Array
(
[0] => Industries & Professions
[1] => Books
[2] => Business & Personal Finance
)
[genreIds] => Array
(
[0] => 10005
[1] => 38
[2] => 9009
)
[releaseDate] => 2013-10-03T07:00:00Z
[trackId] => 737317739
[trackName] => Yelp for Business
[formattedPrice] => $1.99
[artistIds] => Array
(
[0] => 413390948
[1] => 413390943
)
[artworkUrl60] => http://a2.mzstatic.com/us/r30/Publication6/v4/48/d4/fe/48d4fe78-2668-0c25-02f2-0e1cf2c21983/9781118857731.60x60-50.jpg
[artistViewUrl] => https://itunes.apple.com/us/artist/gradiva-couzin-jennifer-grappone/id413390948?mt=11&uo=4
[trackCensoredName] => Yelp for Business
[fileSizeBytes] => 2703426
[artworkUrl100] => http://a4.mzstatic.com/us/r30/Publication6/v4/48/d4/fe/48d4fe78-2668-0c25-02f2-0e1cf2c21983/9781118857731.100x100-75.jpg
[trackViewUrl] => https://itunes.apple.com/us/book/yelp-for-business/id737317739?mt=11&uo=4
)
)
)
when i write it into csv file i get following error
Array to string conversion in D:\wamp\www\search_book\search_code.php on line 29
please guide me.. i am new to this
fputcsv only accept one dimension array, not multidimensional array. You have to convert the genres, genreIds, artistIds, etc into string. Maybe you need something like implode() method.
For example:
foreach($josn_decoded['results'] as $search_result) {
if (is_array($search_result)) {
$search_result = implode('|', $search_result);
}
fputcsv($fp, $search_result);
}
So in csv, your genres column be like Cookbooks, Food & Wine|Books|Business & Personal Finance.
Try this one :)
<?php
$json_str = "{'aintlist':[4,3,2,1], 'astringlist':['str1','str2']}";
$json_obj = json_decode ($json_str);
$fp = fopen('file.csv', 'w');
foreach ($json_obj as $fields)
{
fputcsv($fp, $fields);
}
fclose($fp);
?>

Get value in mutli array

How would i get the value of a key in an array?
The array is done by google shopping api which is:
// Valid source values are "public", "cx:cse", and "gan:pid"
// See http://code.google.com/apis/shopping/search/v1/getting_started.html#products-feed
$source = "public";
// For more information about full text search with the shopping API, please
// see http://code.google.com/apis/shopping/search/v1/getting_started.html#text-search
$query = "\"mp3 player\" | ipod";
//The order in which the API returns products is defined by a ranking criterion.
// See http://code.google.com/apis/shopping/search/v1/getting_started.html#ranking
$ranking = "relevancy";
$results = $service->products->listProducts($source, array(
"country" => "UK",
"q" => $query,
"rankBy" => $ranking,
));
print "<h1>Shopping Results</h1><pre>" . print_r($results, true) . "</pre>";
I have the following array which outputs:
Shopping Results
Array
(
[kind] => shopping#products
[etag] => "*********"
[id] => tag:google.com,2010:shopping/products
[selfLink] => https://www.googleapis.com/shopping/search/v1/public/products?country=UK&q=iphone&rankBy=relevancy
[nextLink] => https://www.googleapis.com/shopping/search/v1/public/products?country=UK&q=iphone&rankBy=relevancy&startIndex=26
[totalItems] => 771622
[startIndex] => 1
[itemsPerPage] => 25
[currentItemCount] => 25
[requestId] => 0CMjH976CqbECFYNWtAodLRwAAA
[items] => Array
(
[0] => Array
(
[kind] => shopping#product
[id] => tag:google.com,2010:shopping/products/5735617/11254757413841304510
[selfLink] => https://www.googleapis.com/shopping/search/v1/public/products/5735617/gid/11254757413841304510
[product] => Array
(
[googleId] => 11254757413841304510
[author] => Array
(
[name] => Amazon.co.uk
[accountId] => 5735617
)
[creationTime] => 2012-05-04T05:03:50.000Z
[modificationTime] => 2012-07-20T02:02:16.000Z
[country] => GB
[language] => en
[title] => Apple iPod touch 8GB - Black - 4th Generation (Latest Model - Launched Sept 2010)
[description] => Apple iPod touch 8GB - Black - 4th Generation (Latest Model - Launched Sept 2010)
[link] => http://www.amazon.co.uk/dp/B0040GIZTI/ref=asc_df_B0040GIZTI8843997?smid=A1YZ4RXO7GUOYN&tag=googlecouk06-21&linkCode=asn&creative=22218&creativeASIN=B0040GIZTI
[brand] => Apple
[condition] => new
[gtin] => 00885909394739
[gtins] => Array
(
[0] => 00885909394739
)
[mpns] => Array
(
[0] => MC540BT/A
)
[inventories] => Array
(
[0] => Array
(
[channel] => online
[availability] => inStock
[price] => 135.95
[shipping] => 1.99
[currency] => GBP
)
)
[images] => Array
(
[0] => Array
(
[link] => http://ecx.images-amazon.com/images/I/41p2rNmazRL.jpg
[status] => available
)
)
)
)
[1] => Array
(
[kind] => shopping#product
[id] => tag:google.com,2010:shopping/products/5735617/4597224105326146239
[selfLink] => https://www.googleapis.com/shopping/search/v1/public/products/5735617/gid/4597224105326146239
[product] => Array
(
[googleId] => 4597224105326146239
[author] => Array
(
[name] => Amazon.co.uk
[accountId] => 5735617
)
[creationTime] => 2012-05-04T05:03:50.000Z
[modificationTime] => 2012-07-20T02:02:16.000Z
[country] => GB
[language] => en
[title] => SanDisk Sansa Clip+ 8GB MP3 Player with Radio and Expandable MicroSD/SDHC Slot - Black
[description] => 8 GB memory Digital FM-tuner with 40 preset radio stations Extendable microSD/microSDHC card slot
[link] => http://www.amazon.co.uk/dp/B002NX0ME6/ref=asc_df_B002NX0ME68843997?smid=A3P5ROKL5A1OLE&tag=googlecouk06-21&linkCode=asn&creative=22206&creativeASIN=B002NX0ME6
[brand] => SanDisk
[condition] => new
[gtin] => 00619659059989
[gtins] => Array
(
[0] => 00619659059989
)
[mpns] => Array
(
[0] => SDMX18-008G-E46K
)
[inventories] => Array
(
[0] => Array
(
[channel] => online
[availability] => inStock
[price] => 46.95
[shipping] => 0
[currency] => GBP
)
)
[images] => Array
(
[0] => Array
(
[link] => http://ecx.images-amazon.com/images/I/419U6bYDF1L.jpg
[status] => available
)
)
)
)
I don't need all this data i just need 3-4 of the keys but how would i access them? How would i echo the value of say [title] from each array?
This should work:
foreach( $results as $result)
foreach( $result['product'] as $product)
echo $product['title'];
You could either loop through the array like pointed out above or possibly use array_walk_recursive like this:
$title_array = array();
array_walk_recursive($input_array, 'find_titles');
function find_titles($value, $key) {
global $title_array;
if ($key == 'title') {
$title_array[] = $value;
}
}
This might be a better solution if you you are not certain what the structure of the input array will be (i.e. how many levels deep the key you are looking for is nested).
To output the title of each product in $results:
foreach ($results as $result) {
echo $result['product']['title'];
}
Consider using array_walk_recursive
Working example
<?php
$a = array("hai", array("ha"=>1, "hai"=>2, array("a"=>1, "b"=>2)));
function test($item, $key)
{
echo "$key holds $item\n";
}
array_walk_recursive($a, 'test');
0 holds hai
ha holds 1
hai holds 2
a holds 1
b holds 2
If you are interested only in title
Consider using foreach
foreach($results['item'] as $result) {
echo $result['product']['title'];
}

Recursive function for a multidimensional array?

I am attempting to use a recursive function to search through a multidimensional array, such as the one below, to find certain values, i.e. people who went to certain school, majored in a certain subject, hold a certain job title, etc. In case your wondering, this array is output from the Facebook Graph API. In reality there are more than 3 offset arrays, depending on the number of friends a user has, it could be in the thousands.
Here's a solution I tried with very little knowledge of recursive functions (my first thought was to use in_array before I found out it didn't work for md arrays):
So to give you an idea of how the md array below works, check out this snippet of code:
$friend = $fqlResult[0]['name'];
echo "$friend";
*The output would be "BLANK" since I deleted the person's name.
$data = $fqlResult;
$collegemajor = (isset($value['education'][0]['concentration'][0]['name'])) ? $value['education'][0]['concentration'][0]['name'] : null ;
$major = "Business Administration";
if (isset($collegemajor)) {
foreach($data as $key=> $value) {
if ($value($collegemajor) == $major) {
echo "User $key is majoring in $major";
}
}
}
So here is the multidimensional array referenced above. In this example, I want to pull the names of all of the user's friends who majored in Business Admin. in college. As you can see from this snippet, there aren't any (I think) but in the long version of the array, there are plenty. The code above produces no output and I'm lost as to how to make it work. Any help would be greatly appreciated.
Array
(
[0] => Array
(
[name] => BLANK
[education] =>
[work] =>
)
[1] => Array
(
[name] => BLANK
[education] => Array
(
[0] => Array
(
[school] => Array
(
[id] => 108087985890571
[name] => St. Andrew's School
)
[year] => Array
(
[id] => 138383069535219
[name] => 2005
)
[type] => High School
)
[1] => Array
(
[school] => Array
(
[id] => 20697868961
[name] => Boston University
)
[concentration] => Array
(
[0] => Array
(
[id] => 108654845832522
[name] => Business Administration
)
)
[type] => College
)
[2] => Array
(
[school] => Array
(
[id] => 108289315859633
[name] => University of Miami
)
[year] => Array
(
[id] => 138879996141011
[name] => 2013
)
[type] => Graduate School
)
)
[work] => Array
(
)
)
[2] => Array
(
[name] => BLANK
[education] => Array
(
[0] => Array
(
[school] => Array
(
[id] => 115444241803885
[name] => Saint Andrews High School
)
[year] => Array
(
[id] => 137616982934053
[name] => 2006
)
[type] => High School
)
[1] => Array
(
[school] => Array
(
[id] => 112033702149888
[name] => Boca Raton High
)
[year] => Array
(
[id] => 137616982934053
[name] => 2006
)
[type] => High School
)
[2] => Array
(
[school] => Array
(
[id] => 108087985890571
[name] => St. Andrew's School
)
[type] => High School
)
[3] => Array
(
[school] => Array
(
[id] => 107573562605861
[name] => Duke University
)
[concentration] => Array
(
[0] => Array
(
[id] => 104045469631213
[name] => Political science
)
)
[type] => College
)
)
[work] =>
)
[4] => Array
(
[uid] => 1234567
[name] => BOB NO ONE
[education] => Array
(
[0] => Array
(
[school] => Array
(
[id] => 106039752760627
[name] => Berwick Academy
)
[year] => Array
(
[id] => 137616982934053
[name] => 2006
)
[type] => High School
)
[1] => Array
(
[school] => Array
(
[id] => 108087985890571
[name] => St. Andrew's School
)
[type] => High School
)
[2] => Array
(
[school] => Array
(
[id] => 105690226130720
[name] => Northeastern University
)
[concentration] => Array
(
[0] => Array
(
[id] => 108654845832522
[name] => Business Administration
)
)
[type] => College
[classes] => Array
(
[0] => Array
(
[id] => 189873264368867
[name] => 2011
)
)
)
)
There's really no need for recursion for something like this, considering the depth of the tree is always fixed and the structure is known. Using some nested loops would do the trick:
$friends = $fqlResult;
$friends_BA = array();
foreach ($friends as $friend) {
if (is_array($friend['education'])) {
foreach ($friend['education'] as $school) {
if (isset($school['concentration'])) {
foreach ($school['concentration'] as $concentration) {
if (strpos(strtolower($concentration['name']), 'business') !== false) {
$friends_BA[] = $friend;
continue 3; // skip to the next friend
}
}
}
}
}
}
var_dump($friends_BA);
You want a function that will find a specific value on a specific field in the array,
function arraySearch($key, $value, $array){
$flag = FALSE;
foreach($array as $result){
if(arraySearch($key, $value, $result)){
$flag = TRUE
}elseif(isset($result[$key] && $result[$key] == $value){
$flag = TRUE;
}
}
return $flag
}
to improve performance rather than setting $flag to true, you could return true as it will stop the execution of the function and prevent it from continuing to search the array.
Call it like so
foreach($fqlResult as $result){
if(arraySearch('concentration', 'Business Administration', $result)){
//You have found a user you are looking for, echo $result['name'] or do what you want with the result.
}
}

Categories