Как я могу проверить и удалить дубликаты массивов?

Как я могу проверить и удалить дубликаты массивов?

Пример:

$a = array(
array(
'id' => 1,
'name' => 'test'
),
// Next array is equal to first, then delete
array(
'id' => 1,
'name' => 'test'
),
// Different array, then continue here
array(
'id' => 2,
'name' => 'other'
)
);

Если массив такой же, то удалите дубликат и получите только один массив.

0

Решение

Вы можете использовать справочную таблицу, хранящую сериализованные массивы. Если в таблице поиска уже существует массив, у вас есть дубликат, и вы можете склеить ключ:

$a = array(
array(
'id' => 1,
'name' => 'test'
),
array(
'id' => 1,
'name' => 'test'
),
array(
'id' => 2,
'name' => 'other'
)
);

$seen = [];

for ($i = count($a) - 1; $i >= 0; $i--) {
if (array_key_exists(json_encode($a[$i]), $seen)) {
array_splice($a, $i, 1);
}
else {
$seen[json_encode($a[$i])] = 1;
}
}

print_r($a);

Выход:

Array
(
[0] => Array
(
[id] => 1
[name] => test
)

[1] => Array
(
[id] => 2
[name] => other
)

)

Попытайся!

0

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

array_unique ()

Пример:

$array = array(1, 2, 2, 3);
$array = array_unique($array); // Array is now (1, 2, 3)
0

Вы можете выполнить цикл по родительскому массиву, сериализовать каждый дочерний массив и сохранить его в третьем массиве, а во время цикла проверять наличие серийного номера каждого следующего дочернего массива для всех предыдущих, сохраненных в третьем массиве. Если он существует, удалите текущий дубликат из родительского массива по ключу. Функция ниже демонстрирует это.

function remove_duplicate_nested_arrays($parent_array)

$temporary_array = array(); // declare third, temporary array.

foreach($parent_array as $key =>  $child_array){ // loop through parent array
$child_array_serial = serialize($child_array); // serialize child each array
if(in_array($child_array_serial,$temporary_array)){ // check if child array serial exists in third array
unset($parent_array[$key]); // unset the child array by key from parent array if it's serial exists in third array
continue;
}
$temporary_array[] = $child_array_serial; // if this point is reached, the serial of child array is not in third array, so add it so duplicates can be detected in future iterations.
}
return $parent_array;
}

Этого также можно добиться в 1 строку, используя предложение @Jose Carlos Gp следующим образом:

$b = array_map('unserialize', array_unique(array_map('serialize', $a)));

Вышеприведенная функция расширяет то, что на самом деле происходит в решении с 1 вкладышем.

0
По вопросам рекламы [email protected]