Мне нужна ваша помощь.
Я провел различные исследования, и ни один метод тестирования не работал с 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 )
Обратите внимание, что если у вас есть числа с начальным нулем, вы должны сохранять их как строки, иначе они будут интерпретироваться как восьмеричные числа.
Вы можете использовать (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;
}
Других решений пока нет …