如何从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
)
)
很多人问我如何制作唯一的多维数组。我参考了你的评论,这对我有帮助。
首先,感谢@jeromegamez @daveilers提供的解决方案。但每次我给出答案时,他们都会问我“序列化”和“反序列化”是如何工作的。这就是为什么我想和大家分享这个原因,这样可以帮助更多的人理解这背后的概念。
我解释了为什么我们使用“serialize”和“unserialize”的步骤:
步骤1:将多维数组转换为一维数组
要将多维数组转换为一维数组,首先生成数组内所有元素(包括嵌套数组)的字节流表示。Serialize()函数可以生成值的字节流表示。为了生成所有元素的字节流表示,调用array_map()函数中的serialize()函数作为回调函数。结果将是一个一维数组,无论多维数组有多少层。
步骤2:使值唯一
要使这个一维数组唯一,请使用array_unique()函数。
步骤3:将其还原为多维数组
虽然数组现在是唯一的,但值看起来像字节流表示。要将其还原为多维数组,请使用unserialize()函数。
$input = array_map("unserialize", array_unique(array_map("serialize", $input)));
再次感谢你所做的一切。
如果"remove duplicate "的意思是"remove duplicate,但保留一个",一个解决方案可能是首先在"identifier column"上应用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
(
[Key1] => Array
(
[0] => Value1
[1] => Value2
[2] => Value1
[3] => Value3
[4] => Value1
)
[Key2] => Array
(
[0] => Value1
[1] => Value2
[2] => Value1
[3] => Value3
[4] => Value4
)
)
使用foreach来解决这个问题:
foreach($array as $k=>$v){
$unique=array_unique($v);
$array[$k]=$unique;
}
它会给你以下结果:
Array
(
[Key1] => Array
(
[0] => Value1
[1] => Value2
[3] => Value3
)
[Key2] => Array
(
[0] => Value1
[1] => Value2
[3] => Value3
[4] => Value4
)
)
如果你想重新排列键的顺序,
foreach($array as $k=>$v){
$unique= array_values(array_unique($v));
$array[$k]=$unique;
}
这个操作会给你这样排列的键值:
Array
(
[Key1] => Array
(
[0] => Value1
[1] => Value2
[2] => Value3
)
[Key2] => Array
(
[0] => Value1
[1] => Value2
[2] => Value3
[3] => Value4
)
)
我希望这能澄清一切。
从5.2.9开始,如果你像这样使用SORT_REGULAR标志,你可以使用array_unique():
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()并不用于多维数组。