PHP XML XPath - остановка дублирующих узлов - PullRequest
0 голосов
/ 14 декабря 2011

Я пытаюсь проанализировать XML-документ, используя элемент XPath в простом XML.Однако приведенный ниже скрипт (при поиске записи «U2» в API last.fm) возвращает:

Пассажиры Пассажиры Боно Пассажиры Боно U2 и Пассажиры Green Day Боно U2 и Пассажиры Green Day REM Боно U2и Green Day REM 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 голосов
/ 14 декабря 2011

Я предполагаю, что ваш фрагмент XML является лишь небольшим примером полных результатов, поэтому ...

вам нужно изменить цикл foreach, чтобы проверить, был ли обработанный в данный момент исполнитель виден ранее. Самый простой способ - использовать массив:

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

Как только цикл завершен, у вас есть хороший массив, где каждый исполнитель является ключом к $ увиденному. Чтобы скопировать вашу простую конкатенацию строк, вы просто взорвали / echo:

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