0

XML ファイルを読み込んでいますが、たまたま重複したアイテムが含まれています。それらを削除したいのですが、そうしようとするとエラーが発生します:

メッセージ: 複雑な型をプロパティに割り当てることはまだできません

xml 関数の戻り値はもちろん、項目が配列に格納されているオブジェクトです。これらのアイテムは再びオブジェクトであるため、重複をチェックするのが少し難しくなっていると思います。

私はこれを修正しようとしました:

array_unique((array) $XMLObject);

しかし、それはうまくいかないようです。

誰でもアイデアを得ましたか?

これが私のxmlオブジェクトです:

object(SimpleXMLElement)#19 (5) {
  ["title"]=>
  string(33) "P2000 alarmeringen Heel Nederland"
  ["link"]=>
  string(26) "http://www.p2000zhz-rr.nl/"
  ["description"]=>
  string(54) "Hier vind u alle P2000 alarmeringen van Heel Nederland"
  ["lastBuildDate"]=>
  string(31) "Mon, 10 Sep 2012 22:19:28 +0000"
  ["item"]=>
  array(300) {
    [0]=>
    object(SimpleXMLElement)#22 (5) {
      ["title"]=>
      string(4) "test"
      ["link"]=>
      string(82) "http://feedproxy.google.com/~r/p2000-nederland/~3/OeCbBLSpOKQ/p2000-nederland.html"
      ["description"]=>
      string(194) "Melding: test      Korps/Voertuig: AMBU Brabant Noord (Den Bosch-Ambu 21-102)      Capcode: 1121020<img src="http://feeds.feedburner.com/~r/p2000-nederland/~4/OeCbBLSpOKQ" height="1" width="1"/>"
      ["pubDate"]=>
      string(31) "Mon, 10 Sep 2012 22:20:08 +0000"
      ["guid"]=>
      string(25) "10-09-12_22:20.08_1121020"
    }
    [1]=>
    object(SimpleXMLElement)#23 (5) {
      ["title"]=>
      string(18) "contact supervisor"
      ["link"]=>
      string(82) "http://feedproxy.google.com/~r/p2000-nederland/~3/OeCbBLSpOKQ/p2000-nederland.html"
      ["description"]=>
      string(197) "Melding: contact supervisor      Korps/Voertuig: regio 15 Haaglanden POLITIE 10       Capcode: 1530710<img src="http://feeds.feedburner.com/~r/p2000-nederland/~4/OeCbBLSpOKQ" height="1" width="1"/>"
      ["pubDate"]=>
      string(31) "Mon, 10 Sep 2012 22:19:28 +0000"
      ["guid"]=>
      string(25) "10-09-12_22:19.28_1530710"
    }

したがって、一意の文字列を次の場所に修正する必要があります。$Object->item[1]->title

4

3 に答える 3

0

「重複」の意味を PHP に伝える必要があります。この例の項目 0 と 1 は同一ではなく、プロパティの 1 つに同じ値が含まれているだけです。そのプロパティを検査し、すでに見た値があるかどうかを確認する項目をループする必要があります。

これを行う最も簡単な方法は、ハッシュを作成することです (配列キーは定義上一意であるため)。

$unique_items = array();
foreach ( $sx_document->item as $sx_item )
{
    // Always explicitly cast SimpleXML values to string
    $hash_key = (string)$sx_item->link;

    // This if ensures the first item with each link is kept
    // Without it, later ones would overwrite, leaving you with just the last
    if ( ! array_key_exists($hash_key, $unique_items) )
    {
        $unique_items[$hash_key] = $sx_item;
    }
}
// Throw the keys away if you want your list to be indexed 0, 1, 2, etc
$unique_items = array_values($unique_items);

また、SimpleXML オブジェクトは、実際には非 PHP コードのラッパーであるため、常に「実際の」PHP オブジェクトのように動作するとは限らないことに注意してください。

于 2012-09-12T12:37:55.807 に答える
0

最初に純粋な配列に変換する必要があります (オブジェクトは配列に変換する必要があります)。

function object2array($object)
{
    return @json_decode(@json_encode($object),1);
}

次のステップは、重複を削除することです。

$array = array_unique(object2array($rawdata));

注: ニーズに合わせて微調整する必要がある場合があります。

于 2012-09-10T21:21:51.560 に答える
0

PHP マニュアルのヘルプ セクションをご覧になりましたか? クイック検索では、似たようなものを必要としている人が表示され、「object_unique」関数でその努力を提供しています。

http://www.php.net/manual/en/function.array-unique.php#108421

これは、最もきちんとしたファッションで望むことをしないかもしれませんが、出発点を提供する必要があります. PHP オブジェクトは、試みている方法で配列として扱うことはできません。

別の方法として、SimpleXML オブジェクトを反復処理する関数を作成し、別の配列を維持して、特定のアイテムを以前に見たことがあるかどうかを記録することもできます。spl_object_hash完全なアイテム レベル オブジェクトの重複があることがわかっている場合は、PHP 関数を使用してこれを行うことができます。オブジェクトごとに「リンク」値のみが複製されている場合、これは機能しません。

于 2012-09-10T21:25:32.000 に答える