PHP XML XPath - 停止重复节点

时间:2011-12-14 04:58:49

标签: php xml xpath nodes last.fm

我尝试使用简单XML中的XPath元素解析XML文档。但是下面这个脚本(当在last.fm API中搜索条目“U2”时)返回:

  

乘客乘客Bono乘客Bono U2和绿日乘客   Bono U2和Green Day R.E.M.乘客Bono U2和绿日R.E.M.   INXS

如您所见,有重复的节点。有没有办法可以阻止显示重复/重复节点?

(PHP代码)

$xmlmusic = new SimpleXMLElement($result);
$releases = $xmlmusic->xpath('artist/similar/artist');
foreach ($releases as $artist) {
$artistResult .= $artist->name . PHP_EOL;
echo $artistResult;}

(XML文件)

<?xml version="1.0" encoding="utf-8"?>
<lfm status="ok">
<artist>
  <name>U2</name>
  <mbid>704acdbb-1415-4782-b0b6-0596b8c55e46</mbid>
  <url>http://www.last.fm/music/U2</url>
  <image size="small">http://userserve-ak.last.fm/serve/34/107345.jpg</image>
  <streamable>1</streamable>
    <stats>
    <listeners>2613654</listeners>
    <playcount>96947986</playcount>
    </stats>

<similar>
  <artist>
  <name>Passengers</name>
  <url>http://www.last.fm/music/Passengers</url>
  <image size="small">http://userserve-ak.last.fm/serve/34/4826014.jpg</image>
  </artist>

1 个答案:

答案 0 :(得分:0)

我假设你的XML片段只是完整结果的一小部分,所以......

您需要修改foreach循环以检查之前是否已经看过当前正在处理的艺术家。最简单的方法是使用数组:

$seen = array();
foreach ($releases as $artist) {
    if (!isset($seen[$artist->name])) {
        $seen[$artist->name] = true;
    }
}

一旦完成循环,你就会得到一个很好的数组,每个艺术家都是$ see的关键。要复制简单的字符串连接,只需内嵌/ echo:

echo implode(array_keys(', ', $seen));