从多维(3+层)数组的最低子数组中递归删除重复值

问题描述 投票:0回答:2

我做过各种研究,但没有任何测试方法适用于 3 级或更多阵列。

我需要只保留多维数组中唯一的值。

我的阵列:

$array = [
    'sucesso' => [
        'LAUDO_VISTORIA' => [
            0 => '0027',
            2 => '30027',
            3 => '0027',
        ],
        'LAUDO' => [
            0 => '0027',
            2 => '30027',
            3 => '0027',
        ],
        'DADOS_DO_VEICULO' => [
            0 => '0027',
            1 => '30027',
        ]
    ],
    'code' => 201
];
php recursion multidimensional-array duplicates array-unique
2个回答
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;
    }

0
投票

对于您的示例输入,不需要递归。

代码:(演示

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));
© www.soinside.com 2019 - 2024. All rights reserved.