0

次のスクリプトは、単一のキーに基づいて配列から重複を削除します。次の参考文献で見つけました。参照:配列から重複を削除します(キーによる配列unic)

問題は、$ initial_data配列に、[Post_Date]値は同じで、 [ Item_Title]値が異なるアイテムが含まれている可能性があることです。

[Post_Date][Item_Title ]の両方の値が同一である場合にのみ重複を削除するようにコードを変更する方法はありますか?

 // Remove Duplicates based on 'Post_Date'
    $_data = array();
    foreach ($initial_data as $v) {
      if (isset($_data[$v['Post_Date']])) {
        continue;
      } 
      $_data[$v['Post_Date']] = $v;
    }
    // if you need a zero-based array, otherwise work with $_data
       $unique_results = array_values($_data);

以下は、4つのフィールドを示す配列の簡略化された出力です。元の配列には16個のフィールドが含まれています。

$ initial_data:元のデータ配列。[Post_Date]の値は同じですが、[Item_Title]の値は異なります。

Array
(
    [0] => Array
        (
            [id] => 22000
            [Category] => vehicles
            [Post_Date] => 1356373690
            [Item_Title] => Car Painting
        )

    [1] => Array
        (
            [id] => 22102
            [Category] => vehicles
            [Post_Date] => 1356373690
            [Item_Title] => Car Repair

        )
...
)

$ _data:スクリプト内からの$_data配列

Array
(
    [1356373690] => Array
        (
            [id] => 22000
            [Category] => vehicles
            [Post_Date] => 1356373690
            [Item_Title] => Car Painting
        )

    [1356373690] => Array
        (
            [id] => 22102
            [Category] => vehicles
            [Post_Date] => 1356373690
            [Item_Title] => Car Repair

        )
...
)

$ unique_results:最終的な一意の結果配列。ご覧のとおり、重複する配列項目は[Post_Date]のみに基づいてスクリプトによって削除されましたが、この配列項目が重複していると見なされないように、[Item_Title]の値が異なるか同一であるかどうかも評価する必要があります。

Array
(
    [0] => Array
        (
            [id] => 22000
            [Category] => vehicles
            [Post_Date] => 1356373690
            [Item_Title] => Car Painting
        )
...
)
4

2 に答える 2

1

$data最も簡単な方法は、これら2つのプロパティの単純な連結をこのハッシュのキーとして使用することだと思います。

$key = $v['Post_Date'] . $v['Item_Title'];
if (isset($_data[$key])) {
  continue;
} 
$_data[$key] = $v;

Post_DateとItem_Titleが「オーバーラップ」できる場合は明らかに機能しませんが、指定されたサンプルからは不可能のようです。これを防ぐために、次$keyのように、その中に区切り記号を挿入できます。

$key = $v['Post_Date'] . ':' . $v['Item_Title'];

...コロン記号は、タイムスタンプ文字列の格納には明らかに使用されないためです。

于 2012-12-24T23:41:18.070 に答える
0

ネストされたループでこれを解決できます

$uniqueData = array();
foreach ($initialData as $item) {
    $exists = false;

    // check if same item was already added to uniqueData array
    foreach ($uniqueData as $uniqueItem)
        if($item['postDate'] == $uniqueItem['postDate'] && $item['itemTitle'] == $uniqueItem['itemTitle'])
            $exists = true;

    // there is no same item in uniqueData array
    if(!$exists)
        $uniqueData[] = $item;
}

print_r($uniqueData);

ちなみに、ほとんどの場合continue、コードを読みにくくするため、ステートメントの使用は避けるのが最善です。

于 2012-12-24T23:58:19.997 に答える