Делаем элементы массива уникальными
Одномерные массивы
$arr = [ 'a', 1 => 5, 'a', 7 ];
$arr = array_unique( $arr );
Показать код
Результат:
Array
(
[0] => a
[1] => 5
[3] => 7
)
Ключи элементов сохраняются. Для двух идентичных элементов будет сохранен ключ первого. Регистр символов имеет значение, а вот строковый элемент или числовой значения не имеет, поскольку все элементы сравниваются между собой как строки.
$arr = [ 'a', 1 => 5, 'A', '5' ];
$arr = array_unique( $arr );
Показать код
Результат:
Array
(
[0] => a
[1] => 5
[2] => A
)
При желании это можно изменить с помощью второго аргумента функции array_unique
.
Многомерные массивы
Использовать в лоб функцию arr_unique
для многомерных массивов нельзя. Ищем обходные пути.
Пример 1
Если надо уникализировать элементы 2-го уровня двумерного массива, то можно сделать так:
foreach( $arr as &$item ) {
$item = array_unique( $item );
}
Показать код
Пример 1
Рекурсивная функция для уникализации значений многомерного массива.
$arr = [
1 => 5,
[
'a' => 1,
1 => 5,
'c' => 5,
[ 2, 'a' ],
[ 2, 'a' ]
]
];
function arr_unique( $array ) {
$result = array_map( 'unserialize', array_unique( array_map( 'serialize', $array ) ) );
foreach( $result as $key => $value ) {
if( is_array( $value ) ) {
$result[$key] = arr_unique( $value );
}
}
return $result;
}
$arr = arr_unique( $arr );
Показать код
Результат:
Array (
[1] => 5
[2] => Array (
[a] => 1
[1] => 5
[2] => Array (
[0] => 2
[1] => a
)
)
)
Совпадающие значения ищутся в рамках текущего проверяемого массива, а не в рамках всего исходного массива. Так значения в строках 2 и 5 идентичны, но они не будут сравниваться, так как находятся в разных уровнях исходного массива.