当我使用var_dump时,我有一个看起来像这样的数组:
array(4) {
[0]=> array(2) {
[0]=> string(1) "1"
["userID"]=> string(1) "1"
}
[1]=> array(2) {
[0]=> string(1) "2"
["userID"]=> string(1) "2"
}
[2]=> array(2) {
[0]=> string(1) "1"
["userID"]=> string(1) "1"
}
[3]=> array(2) {
[0]=> string(1) "1"
["userID"]=> string(1) "1"
}
}
那是1,2,1,1
我尝试使用array_unique($arr)
但是在此特定数组上,而不是将其转换为1,2
,它只是将数组转换为1
。
应该可行,但我不确定为什么不这样做。
答案 0 :(得分:4)
array_unique仅删除其字符串值相等的元素。子阵列不是这种情况。
您需要手动迭代数组(在使用用户函数排序后)并取消设置双打。不好意思,对不起。
答案 1 :(得分:2)
一种快速而又脏的方法可能是迭代所有元素,序列化值并将它们用作包含其值的新数组中的键,然后在该数组上使用array_values()
,如下所示: / p>
<?php
function array_unique_recursive(array $a) {
$result = array();
foreach ($a as $item)
$result[serialize($item)] = $item;
return array_values($result);
}
?>
答案 2 :(得分:2)
我猜你所关心的只是知道结果集中存在哪些userID。因此,我将首先压平阵列。执行此操作后,我可以应用array_unique
仅获取唯一值。正如其他人所说,array_unique
不适用于多维数组。
$flattened = array_map(
function($e) { return $e['userID']; },
$array
);
$unique = array_unique($flattened);
如果您喜欢foreach
循环,那么它看起来就像这样。
$flattened = array();
foreach ($array as $v) {
$flattened[] = $v['userId'];
}
$unique = array_unique($flattened);
还有另一种方法可以找到独特的元素,与{O}(nlogn)相比,性能提升超过array_unique
- O(n)时间复杂度。也就是说,array_unique($array)
相当于array_keys(array_flip($array))
。
答案 3 :(得分:0)
<?php
$arr = array(
array ( 0=>"1",
userID=>"1"),
array ( 0=>"2",
userID=>"2"),
array ( 0=>"1",
userID=>"1"),
array ( 0=>"1",
userID=>"1"));
$arr_unique=array_unique($arr);
echo '<pre>';
var_dump($arr_unique);
echo '</pre>';
?>
答案 4 :(得分:0)
尝试使用排序常规过滤器...
<?php
$arr = array_unique($arr, SORT_REGULAR);
?>