我需要你的帮助。 我做过各种研究,但没有任何测试方法适用于 3 级或更多阵列。 我需要只保留多维数组中唯一的值..
我的阵列:
数组 ( [成功] => 数组 ( [LAUDO_VISTORIA] => 数组 ( [0] => 0027 [2] => 30027 [3] => 0027 ) [LAUDO] => 数组 ( [0] => 0027 [2] => 30027 [3] => 0027 ) [DADOS_DO_VEICULO] => 数组 ( [0] => 0027 [1] => 30027 ) ) [代码] => 201 )
请注意,如果您有前导零的数字,则应将它们存储为字符串,否则它们将被解释为八进制数字。 当你输出它们时,你可以使用 (int) 来获得正确的类型转换。
下面的第一个代码通过使用
serialize
作为 array_map
中的回调来展平数组,使用 array_unique
删除重复项,然后使用 array_intersect_key
重新组合在一起,该过程循环以到达更深层次的数组。
下面的第二个代码遵循相同的逻辑,但
array_unique
仅在每个数组键路径的最深层执行。
添加了 if/else 语句,因为并非所有数组键路径都具有相同的长度/深度。 (如果有人知道更好的方法,请告诉我。)
serialize
可以替换为json_encode
,但我不确定哪个更快。
我不太擅长解释事情是如何运作的,如果你能更好地重新表述我上面所说的内容,请随意编辑。
删除多维数组中的重复项,包括重复的子数组和元素。
function multi_unique($array){
$temp = array_intersect_key($array, array_unique(array_map("serialize", $array)));
foreach ($temp as $key => $value){
if ( is_array($value) ){
$temp[$key] = multi_unique($value);
}
}
return $temp;
}
从每个关键路径最深端的子数组中删除重复元素。
function multi_unique($array){
$temp = array_intersect_key($array, array_map("serialize", $array));
foreach ($temp as $key => $value){
if (is_array($value)){
$temp[$key] = multi_unique($value);
}
//the else if statement is to counter the problem where the deepest level of each path is different
else if (count($temp) == count($temp, COUNT_RECURSIVE)){
$temp=array_unique($temp);
}
}
return $temp;
}
对于您的示例输入,不需要递归。
代码:(演示)
foreach ($array['sucesso'] as &$row) {
$row = array_unique($row);
}
var_export($array);
或(演示)
$array['sucesso'] = array_map('array_unique', $array['sucesso']);
var_export($array);
对于仅删除不包含子数组的子数组中的重复项的递归方法,请在递归过程中包含该条件。 (演示)
function r_array_unique($array) {
$hasChildren = false;
foreach ($array as &$item) {
if (is_array($item)) {
$hasChildren = true;
$item = r_array_unique($item);
}
}
return $hasChildren ? $array : array_unique($array);
}
var_export(r_array_unique($array));