以下脚本将基于单一密钥从阵列中删除重复项。我通过以下参考找到了它。 参考:remove duplicates from array (array unic by key)
问题我的 $ initial_data 数组可能包含具有相同 [Post_Date] 值但不同 [Item_Title] 值的项目
有没有办法修改代码,只有当 [Post_Date] 和 [Item_Title] 值都是identicle时才会删除重复项?
// 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
)
...
)
答案 0 :(得分: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'];
...因为冒号符号显然不会用于存储时间戳字符串。
答案 1 :(得分: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
语句,因为它会使您的代码更难阅读。