【问题标题】:PHP remove duplicate XML feed entriesPHP 删除重复的 XML 提要条目
【发布时间】:2012-03-29 08:52:31
【问题描述】:

您好,我正在使用 PHP 解析一个 XML 文件,以创建另一个格式更好的 XML 文件,我最终将使用它来填充一个无序的 HTML 列表。

但是 XML 提要有重复的条目,因此我的格式化输出也有重复的条目。我怎样才能循环浏览提要并以某种方式删除重复项?尽可能使用 PHP。我是一个新手,不知道如何处理这个。

这是一个典型的输出(我的带有重复的格式化 XML):

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

任何帮助都会很棒。谢谢。

更新:

我在循环通过提要之前定义了一个数组,如下所示:

$filmList = array();

在整个列表中循环时,我使用以下方法添加了条目:

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

其中 $filmTitle 和 $filmLink 是来自已解析 XML 的值。我将如何从中删除重复项?还是一开始就阻止他们进入?

谢谢...

【问题讨论】:

  • 您可以使用将值放入其中的哈希图(Filmtitle => Filmlink)并检查该值是否已存在于数组中?
  • 那将是 php 中的关联数组。

标签: php html xml parsing


【解决方案1】:

试试这个:

<?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();

?>

这将清除filmlink 的重复项

【讨论】:

  • 这很好。干净、简单,并将内容保存在 XML 中。
【解决方案2】:

只需将这些对放在一个数组中,使用标题作为键,链接作为值。您只需在插入数组时覆盖重复项。

请参阅question,了解有关 Java 哈希图和 PHP 数组的讨论。

编辑:

类似这样的:

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

$target = array();

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

这会让你:

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

使用此设置,无需检查密钥是否已存在。

【讨论】:

  • @AdamWaite 您可以在使用array_key_exists 输入之前检查数组中是否已经存在一个值。
猜你喜欢
  • 2016-06-26
  • 2015-07-09
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 2013-03-09
  • 1970-01-01
  • 2014-04-05
相关资源
最近更新 更多