如何从PHP中的多维数组中删除重复值?
示例数组:
Array ( [0] => Array ( [0] => abc [1] => def ) [1] => Array ( [0] => ghi [1] => jkl ) [2] => Array ( [0] => mno [1] => pql ) [3] => Array ( [0] => abc [1] => def ) [4] => Array ( [0] => ghi [1] => jkl ) [5] => Array ( [0] => mno [1] => pql ) )
小智.. 617
这是另一种方式.不保存任何中间变量.
我们使用它来删除各种重叠查询的结果.
$input = array_map("unserialize", array_unique(array_map("serialize", $input)));
由于反序列化,数组越大越慢,数组越复杂.我使用array_intersect_key是有原因的(在此答案之前半年). (22认同)
@OIS刚刚测试了它,有一个错字但是它有效..感谢老兄!:$ no_duplicates = array_intersect_key($ array,array_unique(array_map('serialize',$ array))); (9认同)
如果你想让索引连续,请使用array_values,即$ input = array_values(array_map("unserialize",array_unique(array_map("serialize",$ input)))); (3认同)
现在你可能会选择json_encode和json_decode而不是PHP序列化.应该为所提供的值带来好处*和*您不会遇到序列化/反序列化的PHP序列化详细信息,并且很可能是不需要的. (3认同)
请注意`serialize(array('a'=>'1','b'=>'1'))`与`serialize(array('b'=>'1','a'=>')不同1' ))`.对于用作`sets`或`(hash)maps`的数组,此选项将失败. (2认同)
Ja͢ck.. 223
从5.2.9开始,array_unique()
如果你使用这样的SORT_REGULAR
标志就可以使用:
array_unique($array, SORT_REGULAR);
这使得函数比较元素的相等性,就好像$a == $b
正在使用一样,这非常适合您的情况.
产量
Array
(
[0] => Array
(
[0] => abc
[1] => def
)
[1] => Array
(
[0] => ghi
[1] => jkl
)
[2] => Array
(
[0] => mno
[1] => pql
)
)
但请记住,文档说明:
array_unique()
不适用于多维数组.
奇怪的是,使用SORT_REGULAR标志对我来说不起作用,删除重复的数组. (4认同)
@Stefan你是对的; 它似乎没有给出正确的结果,但它可能是一个bug,因为它[适用于PHP 7](http://3v4l.org/qESFP)= / (4认同)
这似乎也适用于我的情况,但是在array_unique()doc中这个注释是否还有其他人困扰?http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique-notes (4认同)
小智.. 59
我有一个类似的问题,但我找到了100%的工作解决方案.
"; print_r($arr); echo "unique*********************
"; print_r(super_unique($arr,'titel')); ?>
OIS.. 29
其他方式.也将保留密钥.
function array_unique_multidimensional($input) { $serialized = array_map('serialize', $input); $unique = array_unique($serialized); return array_intersect_key($input, $unique); }
Jeremy Ruten.. 20
用户对array_unique()文档的注释有很多解决方案.这是其中之一:
kenrbnsn at rbnsn dot com
27-Sep-2005 12:09另一个用于多维数组的Array_Unique.我只在二维数组上测试过它,但它可能会被推广到更多,或者使用递归.
此函数使用serialize,array_unique和unserialize函数来完成工作.
function multi_unique($array) { foreach ($array as $k=>$na) $new[$k] = serialize($na); $uniq = array_unique($new); foreach($uniq as $k=>$ser) $new1[$k] = unserialize($ser); return ($new1); }
这是来自http://ca3.php.net/manual/en/function.array-unique.php#57202.
这是另一种方式.不保存任何中间变量.
我们使用它来删除各种重叠查询的结果.
$input = array_map("unserialize", array_unique(array_map("serialize", $input)));
从5.2.9开始,array_unique()
如果你使用这样的SORT_REGULAR
标志就可以使用:
array_unique($array, SORT_REGULAR);
这使得函数比较元素的相等性,就好像$a == $b
正在使用一样,这非常适合您的情况.
产量
Array
(
[0] => Array
(
[0] => abc
[1] => def
)
[1] => Array
(
[0] => ghi
[1] => jkl
)
[2] => Array
(
[0] => mno
[1] => pql
)
)
但请记住,文档说明:
array_unique()
不适用于多维数组.
我有一个类似的问题,但我找到了100%的工作解决方案.
"; print_r($arr); echo "unique*********************
"; print_r(super_unique($arr,'titel')); ?>
其他方式.也将保留密钥.
function array_unique_multidimensional($input) { $serialized = array_map('serialize', $input); $unique = array_unique($serialized); return array_intersect_key($input, $unique); }
用户对array_unique()文档的注释有很多解决方案.这是其中之一:
kenrbnsn at rbnsn dot com
27-Sep-2005 12:09另一个用于多维数组的Array_Unique.我只在二维数组上测试过它,但它可能会被推广到更多,或者使用递归.
此函数使用serialize,array_unique和unserialize函数来完成工作.
function multi_unique($array) { foreach ($array as $k=>$na) $new[$k] = serialize($na); $uniq = array_unique($new); foreach($uniq as $k=>$ser) $new1[$k] = unserialize($ser); return ($new1); }
这是来自http://ca3.php.net/manual/en/function.array-unique.php#57202.
如果"删除重复项"意味着"删除重复项,但让其中一个",则解决方案可能是先array_unique(...)
在"标识符列"上应用,然后在原始数组中删除已从列数组中删除的所有键:
$array = [ [ 'id' => '123', 'foo' => 'aaa', 'bar' => 'bbb' ], [ 'id' => '123', 'foo' => 'ccc', 'bar' => 'ddd' ], [ 'id' => '567', 'foo' => 'eee', 'bar' => 'fff' ] ]; $ids = array_column($array, 'id'); $ids = array_unique($ids); $array = array_filter($array, function ($key, $value) use ($ids) { return in_array($value, array_keys($ids)); }, ARRAY_FILTER_USE_BOTH);
结果是:
Array ( [0] => Array ( [id] => 123 [foo] => aaa [bar] => bbb ) [2] => Array ( [id] => 567 [foo] => eee [bar] => fff ) )
Array ( [0] => Array ( [id] => 1 [name] => john ) [1] => Array ( [id] => 2 [name] => smith ) [2] => Array ( [id] => 3 [name] => john ) [3] => Array ( [id] => 4 [name] => robert ) ) $temp = array_unique(array_column($array, 'name')); $unique_arr = array_intersect_key($array, $temp);
这将从数组中删除重复的名称.钥匙是唯一的