如何从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)));
再次感谢你所做的一切。
从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()并不用于多维数组。
对于长度不受限制的(n)维数组,尝试此解决方案
比如这个数组
$arr= [
0 => [0=>"a" , 1=>"b" , 2=>"c" ] ,
1 => [0=>"x" , 1=>"b" , 2=>"a", 3=>"p"],
2=> [
[
0=>"y" ,
1=>"b" ,
2=> [0=>"x" , 1=>"m" , 2=>"a"]
],
1=>"z" ,
2=>"v"
]
];
这就是答案
$ar2=[];
$ar3=[];
function test($arr){
global $ar2,$ar3;
if(is_array($arr)){
return array_map("test",$arr);
}
if(!isset($ar2[$arr])){
$ar2[$arr]=1;
$ar3[]=$arr;
}
}
array_map("test",$arr);
print_r($ar3);