0

以下脚本将基于单个 key从数组中删除重复项。我通过以下参考找到了它。参考:从数组中删除重复项(数组 uni 键)

我的问题是$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哈希的键:

$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 回答