php按值从多维数组中删除重复项
我想按值删除重复项,您可以从php按值从多维数组中删除重复项,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我想按值删除重复项,您可以从列表\u title中看到。我知道有几个问题和答案,但他们的解决方案不适合我 以下是我尝试过的: $uniqueArray = array_map("unserialize", array_unique(array_map("serialize", $notify))); 结果: Array ( [0] => Array ( [list_id] => 86 [list_reference] => 130948
列表\u title
中看到。我知道有几个问题和答案,但他们的解决方案不适合我
以下是我尝试过的:
$uniqueArray = array_map("unserialize", array_unique(array_map("serialize", $notify)));
结果:
Array
(
[0] => Array
(
[list_id] => 86
[list_reference] => 130948
[list_title] => Offer: apartment 2+kk
[list_city] => Prague
[list_date] => 2017-03-03 11:20:35
[list_status] => 0
[list_creator] => Company A
[list_price] => 30000
[list_furniture] => ["1","0","0"]
[list_accommodation] => flat
)
[1] => Array
(
[list_id] => 87
[list_reference] => 130947
[list_title] => Offer: apartment 2+kk
[list_date] => 2017-03-03 11:20:35
[list_status] => 0
[list_creator] => Company B
[list_price] => 30000
[list_furniture] => ["1","0","0"]
[list_accommodation] => flat
)
[2] => Array ...
由于标题的原因,预期结果应为以下结果之一:
Array
(
[0] => Array
(
[list_id] => 86
[list_reference] => 130948
[list_title] => Offer: apartment 2+kk
[list_city] => Prague
[list_date] => 2017-03-03 11:20:35
[list_status] => 0
[list_creator] => Company A
[list_price] => 30000
[list_furniture] => ["1","0","0"]
[list_accommodation] => flat
)
试试这个
<?php
function super_unique($array)
{
$result = array_map("unserialize", array_unique(array_map("serialize", $array)));
foreach ($result as $key => $value)
{
if ( is_array($value) )
{
$result[$key] = super_unique($value);
}
}
return $result;
}
?>
只需在数组中循环并跟踪重复的字段条目 对于重复数组,只考虑使用
list\u id
和list\u title
,但可以添加额外字段。所有其他键都将被忽略
<?php
$array = [
[
"list_id" => 86,
"list_reference" => 130948,
"list_title" => "Offer: apartment 2+kk",
"list_city" => "Prague",
"list_date" => "2017-03-03 11:20:35",
"list_status" => 0,
"list_creator" => "Company A",
"list_price" => 30000,
"list_furniture" => '""1","0","0""',
"list_accommodation" => "flat"
],
[
"list_id" => 87,
"list_reference" => 130947,
"list_title" => "Offer: apartment 2+kk",
"list_date" => "2017-03-03 11:20:35",
"list_status" => 0,
"list_creator" => "Company B",
"list_price" => 30000,
"list_furniture" => '""1","0","0""',
"list_accommodation" => "flat"
]
];
$duplicateFields = ["list_id" => array(), "list_title" => array()];
foreach ($array as $index => $value) {
if(in_array($value['list_id'], $duplicateFields['list_id']) || in_array($value['list_title'], $duplicateFields['list_title'])){
unset($array[$index]);
}else{
array_push($duplicateFields['list_id'], $value['list_id']);
array_push($duplicateFields['list_title'], $value['list_title']);
}
}
var_dump($array);
因此,基本上您希望通过
'list\u title'
列删除重复项。让我们假设我们保留此标题的第一个匹配项。然后,您可以使用两个标准函数来实现这一点:
// Reverse array, so the first occurrence kept.
$data = array_reverse($data);
$result = array_reverse( // Reverse array to the initial order.
array_values( // Get rid of string keys (make array indexed again).
array_combine( // Create array taking keys from column and values from the base array.
array_column($data, 'list_title'),
$data
)
)
);
这是
更新:
根据@mickmackusa注释,代码可简化为:
$result = array_reverse(array_values(array_column(
array_reverse($data),
null,
'list_title'
)));
这在关于列\u键
参数规格中进行了说明:
返回完整的数组或对象也可能为NULL(这是
与索引_键一起使用可重新索引数组)
谢谢大家,有时候过度思考会影响常识 我通过MYSQL查询简单地解决了这个问题,如下所示:
GROUP BY list_title ORDER BY list_date
列表id是唯一的吗?所以你想删除具有相同列表id的数组?最终结果应该是什么样子?@RomanPerekhrest我用预期的结果编辑了我的问题result@Shina但什么是独特的领域?仅列出id和列表标题?@iyop45 yes两者都应该是唯一的。谢谢谢谢但我也试过了,没用。有关预期结果,请参阅我编辑的问题。此答案将考虑空间复杂性和时间复杂性?无需考虑。
array\u column()。不要使用array\u combine()
。查看当您将array\u column()
的第二个参数设置为null
时会发生什么情况。有人能向我解释一下更新后的解决方案是如何工作的吗?我迷路了。好的,array\u列
将通过list\u title
重新索引数组。这意味着对于相同的列表标题
,最后一项将覆盖所有以前的标题。但我们要的是第一件,不是最后一件。因此,我们使用array\u reverse
在开始时反转数组,并在结束时反转它。这应该是这个问题的公认答案
GROUP BY list_title ORDER BY list_date