使用PHP从数组中删除重复的条目

时间:2011-03-23 22:08:55

标签: php arrays

当我使用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

应该可行,但我不确定为什么不这样做。

5 个答案:

答案 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); ?>