使用PHP从多维(3 +级别)数组中删除重复值

时间:2016-06-13 13:48:26

标签: php json multidimensional-array array-unique

我需要你的帮助。 我做了各种研究,没有测试方法适用于3级或更多阵列。 我只需要在多维数组中只留下一些值..

See this example

我的阵列:

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
)

1 个答案:

答案 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;
    }