Делаем элементы массива уникальными

Одномерные массивы

Скопировано
$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 идентичны, но они не будут сравниваться, так как находятся в разных уровнях исходного массива.