Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php按值从多维数组中删除重复项_Php_Arrays_Multidimensional Array - Fatal编程技术网

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