PHP通过值从多维数组中移除重复项。

12

我想根据值删除重复项,正如您可以从list_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
)

列表ID是唯一的吗?所以您想删除具有相同列表ID的数组? - Roy
@iyop45 是的,两者都应该是唯一的。谢谢。 - Shina
你想把下面标有“Result”的数组转换成最后一个数组吗? - marmeladze
@marmeladze 是正确的,因为标题是相同的。我正在使用 array_unique($notify, SORT_REGULAR),它可以很好地工作,但我认为它不能用于字符串值...不确定。 - Shina
其他元素怎么样? - marmeladze
显示剩余2条评论
3个回答

13

基本上,您想通过'list_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'
)));

column_key参数的规范中,文档中已经将其描述如下:

它也可以是NULL以返回完整的数组或对象(这对于与index_key一起重新索引数组非常有用)。


2
array_column()比这个更智能。不要使用array_combine()。看看当您将array_column()的第二个参数设置为null时会发生什么。 - mickmackusa
有人能向我解释一下更新后的解决方案是如何工作的吗?我很迷惑。 - Yousof K.
1
@YousofK。嗯,array_column将按list_title重新索引数组。这意味着对于相同的list_titles,最后一个项目将覆盖所有先前的项目。但我们想要第一个项目,而不是最后一个。因此,我们使用array_reverse在开头反转数组,并在结尾时将其反转回来。 - sevavietl

5
感谢大家,有时候过度思考会影响常识。
我只是从MYSQL查询中解决了它,类似于:
 GROUP BY list_title ORDER BY list_date

0

只需循环遍历数组并跟踪重复字段条目。

仅考虑list_idlist_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);

这将产生:

array(1) {
  [0]=>
  array(10) {
    ["list_id"]=>
    int(86)
    ["list_reference"]=>
    int(130948)
    ["list_title"]=>
    string(22) "Offer:  apartment 2+kk"
    ["list_city"]=>
    string(6) "Prague"
    ["list_date"]=>
    string(19) "2017-03-03 11:20:35"
    ["list_status"]=>
    int(0)
    ["list_creator"]=>
    string(9) "Company A"
    ["list_price"]=>
    int(30000)
    ["list_furniture"]=>
    string(13) """1","0","0"""
    ["list_accommodation"]=>
    string(4) "flat"
  }
}

使用迭代的 in_array() 调用是过滤数组最昂贵的方式之一。随着数组大小的增加,这种技术变得越来越不可取。in_array() 是一种相对较慢的技术,因为它无法享受通过键搜索的性能优势。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接