2011-12-14 3 views
0

간단한 XML에서 XPath 요소를 사용하여 XML 문서를 구문 분석하려고합니다. 그러나 (때 last.fm API의 항목 "U2"검색) 아래에서이 스크립트는 반환PHP XML XPath - 중복 노드를 중지하십시오

승객 승객은 승객 보노의 U2와 그린 데이 승객 보노의 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 문서)

<?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 ($ 결과); $ releases = $ xmlmusic-> xpath ('artist/similar/artist'); $ seen = array(); foreach ($ releases as $ artist) { if (! isset ($ artist [> artist-> name])) { $ seen [$ artist-> name] = true; } } print_r ($ seen); 그러나 빈 배열이 반환되는 이유는 무엇입니까? – MattHeywood