2011-12-14 2 views
0

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

Пассажиры Пассажиры Боно Пассажиры Боно U2 и Green Day Пассажиры Боно U2 и Green Day R.e.m. Пассажиры Bono U2 и Green Day 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 Document)

<?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> 

ответ

0

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

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

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

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

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

Он не возвращался никаких результатов, поэтому я попробовал печать массива: $ xmlmusic = новый SimpleXMLElement ($ результат); $ релизы = $ xmlmusic-> xpath ('artist/similar/artist'); $ seen = array(); foreach ($ релизы как $ artist) { if (! Isset ($ seen [$ artist-> name])) { $ seen [$ artist-> name] = true; } } print_r ($ seen); Однако его возвращение пустого массива? – MattHeywood

 Смежные вопросы

  • Нет связанных вопросов^_^