【问题标题】:php remove duplicates from multidimensional array by value [duplicate]php按值从多维数组中删除重复项[重复]
【发布时间】:2017-07-23 11:13:44
【问题描述】:

我想按值删除重复项,正如您在 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
)

【问题讨论】:

  • list_id 是唯一的吗?所以你想删除具有相同 list_id 的数组?
  • @Shina 但是有哪些独特的领域?只有 list_id 和 list_title 吗?
  • @iyop45 是的,两者都应该是唯一的。谢谢
  • 所以您希望将“结果”一词下方给出的数组转换为最后一个数组?
  • @marmeladze 正确,因为标题相同。我正在使用 array_unique($notify, SORT_REGULAR) 工作正常,但我认为不适用于字符串值......不确定。

标签: php arrays multidimensional-array


【解决方案1】:

所以基本上你想通过'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
        )
    )
);

这里是working demo

更新:

根据@mickmackusa 的评论,代码可以简化为:

$result = array_reverse(array_values(array_column(
    array_reverse($data),
    null,
    'list_title'
)));

这在the docs 中描述了关于column_key 参数规范:

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

【讨论】:

  • array_column() 比这更聪明。不要使用array_combine()。看看将array_column() 的第二个参数设置为null 时会发生什么。
  • 有人可以向我解释一下更新后的解决方案是如何工作的吗?我迷路了。
  • @YousofK。好吧,array_column 将通过list_title 重新索引数组。这意味着对于相同的list_titles,最后一项将覆盖所有以前的。但我们想要第一项,而不是最后一项。所以我们用array_reverse把一个数组开头反转,最后反转回来。
【解决方案2】:

谢谢大家,有时候想太多会影响常识。

我只是通过 MYSQL 查询解决了这个问题:

 GROUP BY list_title ORDER BY list_date

【讨论】:

    【解决方案3】:

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

    只有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() 是一种相对较慢的技术,因为它无法享受按键搜索带来的性能优势。
    猜你喜欢
    • 2011-04-05
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    相关资源
    最近更新 更多