# PHP - is my code efficient?

I am basically getting data from various APIs and using PHP to put them together - like a web mashup. I am currently using 4 foreeach statements to insert the gathered data into their individual arrays. I believe that the current code is inefficient because it takes probably around 3 seconds to load the page which is displaying the PHP data. In the past I had just one big foreach loop to go through all the data at once and also print them. But that too felt inefficient to me.

So how can I make my code more efficient in term of it processing faster? I have seen a few mashup websites such as Soundeer which load around a second. Is that becuase of their code efficiency?

The code which I am using is:

$echonest_uri = simplexml_load_file("http://developer.echonest.com/api/v4/artist/search?api_key=$APIkey&style=rap&results=10&start=$element_num&bucket=id:deezer&bucket=images&sort=familiarity-desc&format=xml"); //Swap the comments for when in UWE or not //$echonest_xml =  new SimpleXMLElement($echonest_uri);$echonest_xml = $echonest_uri;$artist_name = array();
$artist_image = array();$echonest_id = array();
$full_deezer_id = array();$deezer_id = array();
$num_of_albums = array(); //Loop through each entries in the id_arr and make each image of the artist a link to the album page passing all the relevant information. foreach($echonest_xml->artists->artist as $artist){$artist_name[] = $artist->name;$artist_image[] = $artist->images->image[0]->url;$echonest_id[] = $artist->id;$full_deezer_id[] = $artist->foreign_ids->foreign_id->foreign_id; } foreach($full_deezer_id as $key =>$value){
preg_match('#deezer:artist:([A-Z,a-z,0-9]+)#', $value,$id);
$deezer_id[] = (string)$id[1];
}

foreach($deezer_id as$id_index => $id){$deezer_xml = simplexml_load_file("http://api.deezer.com/2.0/artist/$id/albums&output=xml");$num_of_albums[] = $deezer_xml->total; } //The variable which will contain the HTML code to display the artists.$output = null;

foreach($deezer_id as$key => $value){$fav_count_query = "SELECT COUNT(user_index) FROM fav_artist WHERE artist_deezer_id = '$value'";$fav_count_resource = $mysqli->query($fav_count_query);
$fav_count =$fav_count_resource->fetch_assoc();

$output .= <<<HERE <div class="artist-container"> <a href="albums.php?echonest_id={$echonest_id[$key]}&deezer_id={$deezer_id[$key]}&artist_name={$artist_name[$key]}&artist_image={$artist_image[$key]}&num_of_albums={$num_of_albums[$key]}" class="artist-image"> <img src="{$artist_image[$key]}" alt="{$artist_name[$key]}" title="{$artist_name[$key]}"/> </a> <a href="albums.php?echonest_id={$echonest_id[$key]}&deezer_id={$deezer_id[$key]}&artist_name={$artist_name[$key]}&artist_image={$artist_image[$key]}&num_of_albums={$num_of_albums[$key]}" class="artist-name"> {$artist_name[$key]} </a> <a href="albums.php?echonest_id={$echonest_id[$key]}&deezer_id={$deezer_id[$key]}&artist_name={$artist_name[$key]}&artist_image={$artist_image[$key]}" class="album-number">Albums: {$num_of_albums[$key]} </a> </div> HERE; }  - Would you have a few possible values to input so that I can try a few things ? (Of course, I know that the DB query will fail). – Josay Jan 20 '13 at 8:40 foreach->simplexml_load_file("..."); How many calls are this? – mnhg Jan 20 '13 at 12:54 ## 1 Answer Please add the following method do your code and print the runtime of every section of your code. As indicated by my comment I guess the foreach->simplexml_load_file("...") might take a while. //PHP <5.0.0 function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); }$start=microtime_float();
//...
echo microtime_float()-$start; //PHP>=5.0.0$start=microtime(true);
//...
echo microtime(true)-\$start;

-
The codereview of YOUR code is: microtime(true) returns a float value without the need to explode and add. :) –  Sven Jan 20 '13 at 21:38
Your are right :) Nice to know. This was introduced in 5.0.0. I'm so used to this lines that I never checked if there might be a API update. –  mnhg Jan 21 '13 at 4:51