2012-06-20 46 views
1

這是用我的第一次XML文檔。我想要做的是從Spotify搜索中提取一些信息。例如此頁:Spotify ResultsPHP的SimpleXML範圍

我不是作用域的好,我知道,到目前爲止一切都已經從教程。

我想最終的結果看起來像什麼是財產以後這樣的:

(Album Name) - (Artist Name) (year) 

(track number) - (Track Name) - (length) 
(track number) - (Track Name) - (length) 
(track number) - (Track Name) - (length) 
... 

這裏是我到目前爲止的代碼。

<?php 
function print_r2($val){ 
     echo '<pre>'; 
     print_r($val); 
     echo '</pre>'; 
} 

$URL = "http://ws.spotify.com/lookup/1/?uri=spotify:album:77Tgq2oSMvgP4Y9pBVKRJa&extras=trackdetail"; 

$xml = simplexml_load_file($URL) 
    or die("Error: Cannot create object"); 

//print_r2($xml); 

foreach($xml->children() as $album){ 
    echo($album->name); 
    echo($album->artist->name); 
    echo($album->released); 

    foreach($album->children() as $track => $data){ 
     echo $data->{'track-number'}; 
     echo(" - "); 
     echo $data->name; 
     echo(" - "); 
     echo $data->length; 
     echo "<br />"; 
    } 
} 

?> 

說我遇到的問題是藝術家的名字和年份沒有顯示,而且它把更多的「 - 」,那麼需要有。 (猜它是與兒童(),但不輸出任何數據。)

另外,我在想,我保存到一個數組和處理這些信息的數據到一個SQL數據庫。如果你知道一個更好的寫入陣列的方法,那將是非常棒的。 (一舉兩得)。

回答

1

一個超級簡單的方法來解析XML在可行的數組,像這樣:

<?php 
$xml = file_get_contents('http://ws.spotify.com/lookup/1/?uri=spotify:album:77Tgq2oSMvgP4Y9pBVKRJa&extras=trackdetail'); 

//Type cast XML into Array 
$a = json_decode(json_encode((array) simplexml_load_string($xml)),1); 

//See the full array 
//print_r($a); 

echo $a['name'].' - '.$a['artist']['name'].' - '.$a['released'].'<br />'.PHP_EOL; 

foreach($a['tracks']['track'] as $track){ 
    echo $track['track-number'].' - '.$track['name'].' - '.secondsToTime($track['length']).'<br />'.PHP_EOL; 
} 

/* 
Be Lifted High - Bethel Live - 2011<br /> 
1 - You Are Good (feat. Brian Johnson) - 4m25s<br /> 
2 - One Thing Remains (feat. Brian Johnson) - 5m0s<br /> 
3 - Furious (feat. Jeremy Riddle) - 5m16s<br /> 
4 - Be Lifted High (feat. Brian Johnson) - 6m54s<br /> 
5 - God I Look To You (feat. Jenn Johnson) - 7m32s<br /> 
6 - I Will Exalt (feat. Amanda Falk) - 6m44s<br /> 
7 - What Would I Have Done (feat. Brian Johnson and Jenn Johnson) - 6m13s<br /> 
8 - Hope's Anthem (feat. William Matthews) - 5m45s<br /> 
9 - Love Came Down (feat. Brian Johnson) - 5m6s<br /> 
10 - Deep Cries Out (feat. William Matthews) - 5m14s<br /> 
11 - God Of The Redeemed (feat. Jeremy Riddle) - 6m8s<br /> 
12 - Forever And A Day (feat. Jenn Johnson) - 7m5s<br /> 
13 - One Thirst (feat. Jeremy Riddle and Steffany Frizzell) - 7m5s<br /> 
*/ 

function secondsToTime($seconds){ 
    // minutes 
    $divisor_for_minutes = $seconds % (60 * 60); 
    $minutes = floor($divisor_for_minutes/60); 

    // seconds 
    $divisor_for_seconds = $divisor_for_minutes % 60; 
    $seconds = ceil($divisor_for_seconds); 

    // return the final song len string 
    return $minutes."m".$seconds."s"; 
} 
?> 
+0

非常感謝!這真的有幫助。當我在等待答覆我的時候發揮各地與此呼應想出了(gmdate(「H:I:S」輪(floatval($數據 - >長度))));但我會在稍後的日期保存該功能,我相信我會在某個時候需要它。 – Throdne

2

根節點是「專輯」。你應該參考$root->children(),當你應該把根節點當成一個專輯對象。

$url = "http://ws.spotify.com/lookup/1/?uri=spotify:album:77Tgq2oSMvgP4Y9pBVKRJa&extras=trackdetail"; 

$album = simplexml_load_file($url) 
    or die("Error: Cannot create object"); 

echo("name: " . $album->name . "\n"); 
echo("artist: " . $album->artist->name . "\n"); 
echo("released: " . $album->released . "\n"); 
echo "Tracks:\n" ; 
foreach($album->tracks->children() as $track){ 
    echo " " . $track->{'track-number'} . 
     " - " . 
      $track->name . 
      " - " . 
      $track->length . 
      "<br />\n"; 
} 

輸出:

name: Be Lifted High 
artist: Bethel Live 
released: 2011 
Tracks: 
1 - You Are Good (feat. Brian Johnson) - 265.520000<br /> 
2 - One Thing Remains (feat. Brian Johnson) - 300.973000<br /> 
3 - Furious (feat. Jeremy Riddle) - 316.440000<br /> 
4 - Be Lifted High (feat. Brian Johnson) - 414.493000<br /> 
5 - God I Look To You (feat. Jenn Johnson) - 452.520000<br /> 
6 - I Will Exalt (feat. Amanda Falk) - 404.880000<br /> 
7 - What Would I Have Done (feat. Brian Johnson and Jenn Johnson) - 373.160000<br /> 
8 - Hope's Anthem (feat. William Matthews) - 345.160000<br /> 
9 - Love Came Down (feat. Brian Johnson) - 306.880000<br /> 
10 - Deep Cries Out (feat. William Matthews) - 314.480000<br /> 
11 - God Of The Redeemed (feat. Jeremy Riddle) - 368.426000<br /> 
12 - Forever And A Day (feat. Jenn Johnson) - 425.466000<br /> 
13 - One Thirst (feat. Jeremy Riddle and Steffany Frizzell) - 425.493000<br /> 
+0

真棒,真的幫助我理解與作用域方式你寫你的foreach和以上。 – Throdne

1

像這樣的事情可能會爲你工作:

<?php 
$url = "http://ws.spotify.com/lookup/1/?uri=spotify:album:77Tgq2oSMvgP4Y9pBVKRJa&extras=trackdetail"; 
$xml = new SimpleXMLElement(file_get_contents($url)); 

$album = array(
    'name' => (string) $xml->name, 
    'artist' => (string) $xml->artist->name, 
    'released' => (string) $xml->released, 
    'tracks' => array() 
); 

foreach ($xml->tracks->track as $track) { 
    $album['tracks'][] = array(
     'number' => (string) $track->{'track-number'}, 
     'name' => (string) $track->name, 
     'length' => (string) $track->length 
    ); 
} 

print_r($album); 
+0

謝謝。我正在考慮與二維數組一起去,但不知道如何正確地做到這一點。可能會玩弄勞倫斯和你的代碼,看看什麼對我的應用程序最好。 – Throdne