json — удаляет повторяющиеся значения из многомерного (3+ уровня) массива с помощью переполнения стека

Мне нужна ваша помощь.
Я провел различные исследования, и ни один метод тестирования не работал с 3 уровнями или более.
Мне нужно оставить только единственные значения в многомерном массиве ..

Смотрите этот пример

Мой массив:

массив
(
[sucesso] => Массив
(
[LAUDO_VISTORIA] => Массив
(
[0] => 0027
[2] => 30027
[3] => 0027
)
[LAUDO] => Массив
(
[0] => 0027
[2] => 30027
[3] => 0027
)
[DADOS_DO_VEICULO] => Массив
(
[0] => 0027
[1] => 30027
)
)
[код] => 201
)

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

Другие решения

Других решений пока нет …