2012-03-29 23 views
1

Hallo ich bin Parsing eine XML-Datei mit PHP, um eine andere XML-Datei in einem schöneren Format zu erstellen, die ich schließlich verwenden werde, um eine ungeordnete HTML-Liste zu füllen.PHP entfernen doppelte XML-Feed-Einträge

Der XML-Feed enthält jedoch doppelte Einträge. Daher enthält meine formatierte Ausgabe auch doppelte Einträge. Wie kann ich den Feed durchlaufen und die Duplikate irgendwie entfernen? Verwenden Sie PHP wenn möglich. Ich bin ein bisschen Neuling und bin mir nicht sicher, was ich damit anfangen soll.

Hier ist eine typische Ausgabe (meine formatierte XML mit Dubletten):

<films> 
    <film> 
    <filmtitle>Death Race 2</filmtitle> 
    <filmlink>http://www.picturebox.tv/watchnow?id=377029</filmlink> 
    </film> 

    <film> 
    <filmtitle>Death Race 2</filmtitle> 
    <filmlink>http://www.picturebox.tv/watchnow?id=377029</filmlink> 
    </film> 

    <film> 
    <filmtitle>Shattered Glass</filmtitle> 
    <filmlink>http://www.picturebox.tv/watchnow?id=UKIC48</filmlink 
    </film> 

    <film> 
    <filmtitle>Shattered Glass</filmtitle> 
    <filmlink>http://www.picturebox.tv/watchnow?id=UKIC48</filmlink> 
    </film> 

    <film> 
    <filmtitle>The Brothers Bloom</filmtitle> 
    <filmlink>http://www.picturebox.tv/watchnow?id=380196</filmlink> 
    </film> 

    <film> 
    <filmtitle>The Brothers Bloom</filmtitle> 
    <filmlink>http://www.picturebox.tv/watchnow?id=380196</filmlink> 
    </film> 

...and so on... 

Jede Hilfe wäre toll. Vielen Dank.

UPDATE:

ich ein Array definiert haben, bevor sie durch das Futter wie diese Looping:

$filmList = array(); 

Wenn in der gesamten Liste Looping Ich habe hinzugefügt Einträge mit:

array_push($filmsForList, array("filmTitle" => $title, "pictureLink" => $pictureLink); 

wo $ filmTitle und $ filmLink sind die Werte aus dem geparsten XML. Wie würde ich Duplikate daraus entfernen? Oder sie auf gar keinen Fall eintreten lassen?

Dank ...

+0

Sie können eine hashmap verwenden (Filmtitle => Filmlink), die Sie die Werte in setzen und prüfen, ob der Wert allready im Array existiert? – Araw

+0

Das wäre ein assoziatives Array in PHP. – TPete

Antwort

1

Gerade diese Paare in einem Array setzen, den Titel als Schlüssel Link als Wert verwenden. Sie würden einfach Duplikate überschreiben, wenn Sie sie in das Array einfügen.

Eine Erläuterung zu Java-Hashmaps und PHP-Arrays finden Sie unter question.

Edit:

Etwas wie folgt aus:

$a = array("one" => "one_link", "two" => "two_link", "one" => "one_link"); 

$target = array(); 

foreach ($a as $key => $value) 
    $target[$key] = $value; 

Diese erhalten Sie:

array("one" => "one_link", "two" => "two_link") 

Mit diesem Aufbau ist es nicht notwendig zu überprüfen, ob der Schlüssel bereits vorhanden ist.

+0

hey danke für die Antwort, ich bin fast da ich denke, aktualisiert meine Frage ... –

+0

@AdamWaite Sie könnten überprüfen, ob ein Wert bereits im Array vorhanden ist, bevor Sie es eingeben mit 'Array_key_exists'. – TPete

+0

@AdamWaite Bitte sehen Sie meine Bearbeitung. – TPete

5

Versuchen Sie folgendes:

<?php 
$str=<<<'EOT' 
    <films> 
    <film> 
    <filmtitle>Death Race 2</filmtitle> 
    <filmlink>http://www.picturebox.tv/watchnow?id=377029</filmlink> 
    </film> 

    <film> 
    <filmtitle>Death Race 2</filmtitle> 
    <filmlink>http://www.picturebox.tv/watchnow?id=377029</filmlink> 
    </film> 

    <film> 
    <filmtitle>Shattered Glass</filmtitle> 
    <filmlink>http://www.picturebox.tv/watchnow?id=UKIC48</filmlink> 
    </film> 

    <film> 
    <filmtitle>Shattered Glass</filmtitle> 
    <filmlink>http://www.picturebox.tv/watchnow?id=UKIC48</filmlink> 
    </film> 

    <film> 
    <filmtitle>The Brothers Bloom</filmtitle> 
    <filmlink>http://www.picturebox.tv/watchnow?id=380196</filmlink> 
    </film> 

    <film> 
    <filmtitle>The Brothers Bloom</filmtitle> 
    <filmlink>http://www.picturebox.tv/watchnow?id=380196</filmlink> 
    </film> 
    </films> 
EOT; 

$xml=simplexml_load_string($str); 

$seen=array(); 

$len=$xml->film->count(); 
for($i=0;$i<$len;$i++){ 
    $key=(string) $xml->film[$i]->filmlink; 
    if (isset($seen[$key])) { 
     unset($xml->film[$i]); 
     $len--; 
     $i--; 
    }else{ 
     $seen[$key]=1; 
    } 
} 

echo $xml->asXML(); 

?> 

diese Duplikate löscht von filmlink

+0

Das ist gut gemacht. Sauber, einfach und hält Dinge in XML. –