我有一个数组
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 :
Note: Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In words: when the string representation is the same. The first element will be used.
数组的字符串表示只是单词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
这是它的工作原理:
每个数组项都是序列化的。这个 将根据数组的唯一性 内容。
这个结果通过
array_unique
运行, 所以只有具有唯一性的数组 留下签名。array_intersect_key
将采取 独特元素的 key 来自 map/unique 函数(因为源数组的键被保留)并拉 他们出自您的原始来源 数组。
关于php - 如何在数组数组上使用 array_unique?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2561248/