$unique = array_unique($array);
Функция array_unique возвращает массив без повторяющихся значений, она работает и с многомерными массивами. Очисть массивы от дублей можно следующими способами:
Способ №1
Способ №2
Второй способ чувствителен к типу данных, т.е. 0 => 1
, и 0 => '1'
, будут считаться разными.
Удаление дубликатов по одному ключу
function array_unique_key($array, $key) {
$tmp = $key_array = array();
$i = 0;
foreach($array as $val) {
if (!in_array($val[$key], $key_array)) {
$key_array[$i] = $val[$key];
$tmp[$i] = $val;
}
$i++;
}
return $tmp;
}
Например, в массиве нужно удалить дубликаты с одинаковым id, другие элементы массива не важны.
$test = array(
array(
'id' => 1,
'name' => 'Диски Sparco',
'price' => 5000,
),
array(
'id' => 1,
'name' => 'Диски Sparco',
'price' => 6000,
),
array(
'id' => 2,
'name' => 'Автокресло',
'price' => 3000,
),
);
$test = array_unique_key($test, 'id');
print_r($test);
Результат:
Array(
[0] => Array(
[id] => 1
[name] => Диски Sparco
[price] => 5000
)
[2] => Array(
[id] => 2
[name] => Автокресло
[price] => 3000
)
)
Массивы в php в каком то смысле как раз являются хеш-таблицами.
function array_unique_key($array, $key) {
foreach($array as $i => $val) {
if (isset($arrayHashKeys[$val[$key]]) {
unset($array[$i]);
continue;
}
$arrayHashKeys[$val[$key]] = true;
}
return $array;
}
Что тут происходит?
Мы проходимся по массиву и записываем значение каждого ключа в отдельный массив как ключ(значение можно указать любое например true). Но перед тем как записать проверяем, есть ли такой ключ в этом массиве. И если такой ключ есть значит у нас повтор, и мы удаляем элемент массива(можно не удалять, а записывать в новую переменную) и переходим к следующему элементу.
Теперь скорость выполнения заметно увеличится(в некоторых случаях в сотни раз), но вырастут затраты по памяти.