0

I'm using PHP (php-gracenote by Rich Adams) to connect to Gracenote API and retrieve data about various albums/CDs. I've got the basics working - I can connect, create a query and get some data but I'm confused about how to work with the array of data Gracenote sends.

I want to be able to search for an album/CD and display a list of the tracks on that album.

The code I'm using is as follows:

<?php
include("php-gracenote/Gracenote.class.php");

$clientID  = "XXXXXXX"; 
$clientTag = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

$api = new Gracenote\WebAPI\GracenoteWebAPI($clientID, $clientTag); 

$userID = $api->register();

//$results = $api->searchAlbum("Beatles", "Revolver");
//var_dump($results);

$i=0;
while (isset($results[$i])) :
echo $results[$i]["album_artist_name"] . '<br/>';
echo $results[$i]["album_title"] . ', ' . $results[$i]["album_year"] .     '<br/><br/>';
//echo $results[$i]["tracks"]["track_title"]; // my feeble attempt to grab relevant data

$i++;
endwhile;

?>

When I use:

$results = $api->searchAlbum("Beatles", "Revolver");
var_dump($results);

... the data seems to be returned as a large (multidimensional???) array and I can see the track titles here and there amongst the data but I cannot extract and display them.

I guess my question is, how do I work with a complex array in PHP to extract required data?

Here's the first section of the returned data when I use var_dump($results) - there's too much to show it all):

array(10) {
 [0]=&gt;
array(13) {
 ["album_gnid"]=&gt;
 string(40) "7309349-74C2EDC353EA348726D4EDC7B705712F"
 ["album_artist_name"]=&gt;
 string(11) "The Beatles"
 ["album_title"]=&gt;
 string(8) "Revolver"
 ["album_year"]=&gt;
 string(4) "1966"
 ["genre"]=&gt;
 array(3) {
  [0]=&gt;
  array(2) {
    ["id"]=&gt;
    int(25313)
    ["text"]=&gt;
    string(4) "Rock"
  }
  [1]=&gt;
  array(2) {
    ["id"]=&gt;
    int(25332)
    ["text"]=&gt;
    string(9) "60's Rock"
  }
  [2]=&gt;
  array(2) {
    ["id"]=&gt;
    int(25491)
    ["text"]=&gt;
    string(16) "Psychedelic Rock"
  }
}
["album_art_url"]=&gt;
string(0) ""
["artist_image_url"]=&gt;
string(99) "http://akamai-b.cdn.cddbp.net/cds/2.0/image-artist/0907/CA7C/7B5E/3CF8_medium_front.jpg?cid=1920256"
["artist_bio_url"]=&gt;
string(164) "http://web.content.cddbp.net/cds/2.0?id=0AC9F1E7DEF84B87&amp;client=1920256&amp;class=biography&amp;type=text/plain&amp;tag=02-FAyNX5AA5SimoRYGji2zgKvh9LliCiQjTJOnammvNzcmKGySJQ-0g"
["review_url"]=&gt;
string(161) "http://web.content.cddbp.net/cds/2.0?id=F4B46CE1824CDFF5&amp;client=1920256&amp;class=review&amp;type=text/plain&amp;tag=02jCWyg580ffijjOeNpgMYD-33vNd9OY0N72B5abMJa3FKUaP3bDIZcA"
["artist_origin"]=&gt;
array(4) {
  [0]=&gt;
  array(2) {
    ["id"]=&gt;
    int(29894)
    ["text"]=&gt;
    string(14) "Western Europe"
  }
  [1]=&gt;
  array(2) {
    ["id"]=&gt;
    int(29967)
    ["text"]=&gt;
    string(14) "United Kingdom"
  }
  [2]=&gt;
  array(2) {
    ["id"]=&gt;
    int(30296)
    ["text"]=&gt;
    string(7) "England"
  }
  [3]=&gt;
  array(2) {
    ["id"]=&gt;
    int(30793)
    ["text"]=&gt;
    string(9) "Liverpool"
  }
}
["artist_era"]=&gt;
array(1) {
  [0]=&gt;
  array(2) {
    ["id"]=&gt;
    int(29487)
    ["text"]=&gt;
    string(6) "1960's"
  }
}
["artist_type"]=&gt;
array(2) {
  [0]=&gt;
  array(2) {
    ["id"]=&gt;
    int(29422)
    ["text"]=&gt;
    string(4) "Male"
  }
  [1]=&gt;
  array(2) {
    ["id"]=&gt;
    int(29436)
    ["text"]=&gt;
    string(10) "Male Group"
  }
}
["tracks"]=&gt;
array(14) {
  [0]=&gt;
  array(6) {
    ["track_number"]=&gt;
    int(1)
    ["track_gnid"]=&gt;
    string(40) "7309350-3A1042A706E8D9391D2728421B86C7BD"
    ["track_title"]=&gt;
    string(6) "Taxman"
    ["track_artist_name"]=&gt;
    string(11) "The Beatles"
    ["mood"]=&gt;
    array(0) {
    }
    ["tempo"]=&gt;
    array(0) {
    }
  }
  [1]=&gt;
  array(6) {
    ["track_number"]=&gt;
    int(2)
    ["track_gnid"]=&gt;
    string(40) "7309351-8D7A9A90FA399B346AA64396FA6C697A"
    ["track_title"]=&gt;
    string(13) "Eleanor Rigby"
    ["track_artist_name"]=&gt;
    string(11) "The Beatles"
    ["mood"]=&gt;
    array(0) {
    }
    ["tempo"]=&gt;
    array(0) {
    }
  }

Advice much appreciated.

Mekong
  • 439
  • 1
  • 7
  • 25
  • Can you please post an example of the output data. It's hard to know how to parse the array without seeing it – wilkesybear Feb 24 '15 at 00:56
  • Wilkesybear, I've posted an example of the output data up to the first few tracks. There's too much to show all the rest of it. – Mekong Feb 24 '15 at 03:17
  • `foreach ($result as $album) echo $album['album_title'], $album['album_year']; ...` For the nested arrays, do the same: `foreach ($album['genre'] as $genre) echo $genre['text'];` – deceze Feb 24 '15 at 03:18

1 Answers1

1
// Loop through each item that is returned
foreach($results as $result){
    // you should now be at each item.
    echo $result['album_artist_name'];
    echo $result['album_title'];
    // And so on until you have echoed what you want.

    // loop subarrays
    foreach($result['genre'] as $genre){
        // again echo anything here you would like.
        echo $genre['text'];
    }
}   

My opinion here... use print_r($results) I find it outputs the data in a more readable format.

Lars
  • 615
  • 1
  • 4
  • 13