使用 PHP 从多维(3 层以上)数组中删除重复值

Remove duplicate values from multidimensional (3+levels) array with PHP

我需要你的帮助。 我做过各种研究,但没有测试方法适用于 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
)

请注意,如果您有带前导零的数字,您应该将它们存储为字符串,否则它们将被解释为八进制数。 当您输出它们时,您可以使用 (int) 来获得正确的类型转换。

下面的第一个代码通过使用 serialize 作为 array_map 中的回调来展平数组,使用 array_unique 删除重复项,然后使用 array_intersect_key 放回原处,该过程循环以到达数组的更深层次。

下面的第二个代码遵循相同的逻辑,但 array_unique 仅在每个数组键路径的最深层执行。 添加了 if/else 语句,因为并非所有数组键路径都具有相同的 length/depth。 (如果有人知道更好的方法,请告诉我。)

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