У меня есть массив
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 не работает как ожидалось?
Это потому, что 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
Вот как это работает:
Каждый элемент массива сериализуется. Этот будет уникальным на основе содержимого массива .
Результаты обрабатываются через array_unique
,
, поэтому остаются только массивы с уникальными сигнатурами
.
array_intersect_key
берет
ключи уникальных элементов из
функции map / unique (поскольку ключи исходного массива сохраняются) и извлекает
их из ваш исходный исходный массив
.
array_unique ()
поддерживает только многомерные массивы в PHP 5.2.9 и выше.
Вместо этого вы можете создать хэш массива и проверить его на уникальность.
$hashes = array();
foreach($array as $val) {
$hashes[md5(serialize($val))] = $val;
}
array_unique($hashes);
array_unique не работает рекурсивно, поэтому он просто думает "это все Array
ы, давайте убьем все, кроме одного... вот так!"