一尘不染

如何在数组数组上使用array_unique?

php

我有一个数组

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无法按预期工作?


阅读 215

收藏
2020-05-29

共1个答案

一尘不染

这是因为array_unique使用字符串比较来比较项目。从文档

注意:当且仅当(string)$ elem1 ===(string)$
elem2,两个元素才被视为相等。换句话说:当字符串表示相同时。将使用第一个元素。

数组的字符串表示形式就是单词Array,无论其内容是什么。

您可以使用以下方法完成您想做的事情:

$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函数中获取唯一项的键(因为保留了源数组的键),并将其从原始源数组中拉出。

2020-05-29