Как я использую array_unique на массиве массивов?

У меня есть массив

Array(
[0] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 3
        [frame_id] => 3
    )

[1] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 3
        [frame_id] => 3
    )

[2] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 8
        [frame_id] => 8
    )

[3] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 3
        [frame_id] => 3
    )

[4] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 3
        [frame_id] => 3
    )

)

Поскольку Вы видите, что ключевой 0 совпадает с 1, 3 и 4. И ключевые 2 отличаются от них всех.

При выполнении функции array_unique на них оставленное единственное

Array (
[0] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 3
        [frame_id] => 3
    )
)

Какие-либо идеи, почему array_unique не работает как ожидалось?

18
задан halfer 30 May 2019 в 14:25
поделиться

3 ответа

Это потому, что array_unique сравнивает элементы, используя сравнение строк. Из docs :

Примечание. Два элемента считаются равными тогда и только тогда, когда (строка) $ elem1 === (строка) $ elem2. На словах: когда строковое представление такое же. Будет использован первый элемент.

Строковое представление массива - это просто слово Массив , независимо от его содержимого.

Вы можете делать то, что хотите, используя следующее:

$arr = array(
    array('user_id' => 33, 'frame_id' => 3),
    array('user_id' => 33, 'frame_id' => 3),
    array('user_id' => 33, 'frame_id' => 8)
);

$arr = array_intersect_key($arr, array_unique(array_map('serialize', $arr)));

//result:
array
  0 => 
    array
      'user_id' => int 33
      'user' => int 3
  2 => 
    array
      'user_id' => int 33
      'user' => int 8

Вот как это работает:

  1. Каждый элемент массива сериализуется. Этот будет уникальным на основе содержимого массива .

  2. Результаты обрабатываются через array_unique , , поэтому остаются только массивы с уникальными сигнатурами .

  3. array_intersect_key берет ключи уникальных элементов из функции map / unique (поскольку ключи исходного массива сохраняются) и извлекает их из ваш исходный исходный массив .

63
ответ дан 30 November 2019 в 05:50
поделиться

array_unique () поддерживает только многомерные массивы в PHP 5.2.9 и выше.

Вместо этого вы можете создать хэш массива и проверить его на уникальность.

$hashes = array(); 

foreach($array as $val) { 
    $hashes[md5(serialize($val))] = $val; 
} 

array_unique($hashes);
3
ответ дан 30 November 2019 в 05:50
поделиться

array_unique не работает рекурсивно, поэтому он просто думает "это все Arrayы, давайте убьем все, кроме одного... вот так!"

1
ответ дан 30 November 2019 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: