我需要你的帮助。 我做了各种研究,没有测试方法适用于3级或更多阵列。 我只需要在多维数组中只留下一些值..
我的阵列:
Array ( [sucesso] => Array ( [LAUDO_VISTORIA] => Array ( [0] => 0027 [2] => 30027 [3] => 0027 ) [LAUDO] => Array ( [0] => 0027 [2] => 30027 [3] => 0027 ) [DADOS_DO_VEICULO] => Array ( [0] => 0027 [1] => 30027 ) ) [code] => 201 )
答案 0 :(得分:2)
请注意,如果您的数字前导零,则应将它们存储为字符串,否则它们将被解释为八进制数字。 输出时,可以使用(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;
}