php按值从多维数组中删除重复项

时间:2017-03-03 11:07:17

标签: php arrays multidimensional-array

我想从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
)

4 个答案:

答案 0 :(得分:5)

所以基本上你想删除'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一起使用以重新索引数组。)

答案 1 :(得分:2)

试试这个

<?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;
    }
    ?>

答案 2 :(得分:1)

谢谢大家,有时过度思考会影响常识。

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

 GROUP BY list_title ORDER BY list_date

答案 3 :(得分: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"
  }
}