只选择一个节点并继续运行php

时间:2012-12-31 15:41:47

标签: php xml foreach simplexml

我有一个来自Echonest API和Spotify URI的歌曲列表,但它添加了更多我需要的歌曲。我只需要其中一个而不是全部,但我想继续这样做20次。所以我只想获得节点内的第一个轨道并继续前进到下一个轨道。

Here is the xml file I get the info from

这是我使用的PHP:

<iframe src="https://embed.spotify.com/?uri=spotify:trackset:Playlist based on Rihanna:<?php 
$completeurl = "http://developer.echonest.com/api/v4/playlist/static?api_key=FILDTEOIK2HBORODV&artist=Rihanna&format=xml&results=20&type=artist-radio&bucket=tracks&bucket=id:spotify-WW"; 
$xml = simplexml_load_file($completeurl); 
$i = 1;
foreach ($xml->xpath('//songs') as $playlist) {
    $spotify_playlist = $playlist->foreign_id;
    $spotify_playlist2 = str_replace("spotify-WW:track:",'',$spotify_playlist);
    echo  "$spotify_playlist2,"; 
    if ($i++ == 10) break;
}
?>" width="300" height="380" frameborder="0" allowtransparency="true" style="float: right"></iframe>

2 个答案:

答案 0 :(得分:0)

  

所以我只想获得节点内的第一个轨道,然后继续前进到下一个轨道。

您正在描述continue - 它将移至下一次迭代并跳过当前循环中的以下代码。而break结束当前循环。

答案 1 :(得分:0)

您可以通过计算结果来检索歌曲的数量:

$numberOfSongsElements = count($xml->xpath('//songs'));

这应该可以确定您要检索的歌曲是否在那里。例如:

$playlistNumber = 1;
if ($playlistNumber > $numberOfSongsElements) {
    throw new Exception('Not enough <songs> elements');
}
$songsElement = $xml->xpath("//songs[$playlistNumber]");

使用Xpath谓词中的位置编号:

//songs[1]  --  abbreviated form of: //songs[position()=1]
//songs[2]
//songs[3]
...

您可以直接选择您感兴趣的节点,无论是第一个(1)还是其他一些数字,甚至是最后一个(last())。请参阅2.4 Predicates4.1 Node Set Functions

希望这有帮助。正如已经评论过的那样,你的问题并不是那么清楚。我希望计数和编号访问将允许您至少以编程方式选择您正在寻找的元素。