PHP:检查多维数组中的重复值

时间:2011-02-09 18:30:24

标签: php arrays duplicates multidimensional-array

我对多维数组有这个问题。

给出以下多维数组:

Array(
[0] => Array("a", "b", "c")
[1] => Array("x", "y", "z")
[2] => Array("a", "b", "c")
[3] => Array("a", "b", "c")
[4] => Array("a", "x", "z")
)

我想检查它的值并找到重复项(即键0,2和3),只留下一个键 - 值对删除其他键,导致这样的事情:

Array(
    [0] => Array("a", "b", "c")
    [1] => Array("x", "y", "z")
    [2] => Array("a", "x", "z")
    )

我该怎么做?

5 个答案:

答案 0 :(得分:11)

这将使用array_unique()删除数组中的重复项:

$new_arr = array_unique($arr, SORT_REGULAR);

答案 1 :(得分:3)

您只需使用in_array()

即可
$data = Array(
    0 => Array("a", "b", "c"),
    1 => Array("x", "y", "z"),
    2 => Array("a", "b", "c"),
    3 => Array("a", "b", "c"),
    4 => Array("a", "x", "z"),
);

$final = array();
foreach ($data as $array) {
    if(!in_array($array, $final)){
        $final[] = $array;
    }
}

会给你一些类似的东西

array(3) {
  [0] => array(3) {
    [0] => string(1) "a"
    [1] => string(1) "b"
    [2] => string(1) "c"
  }
  [1] => array(3) {
    [0] => string(1) "x"
    [1] => string(1) "y"
    [2] => string(1) "z"
  }
  [2] => array(3) {
    [0] => string(1) "a"
    [1] => string(1) "x"
    [2] => string(1) "z"
  }
}

答案 2 :(得分:1)

你可以通过序列化来智能化,以便比较数组。

var_dump(makeUnique($data));

function makeUnique(array $data)
{
    $serialized = array_map(create_function('$a', 'return serialize($a);'), $data);
    $unique = array_unique($serialized);
    return array_intersect_key($unique, $data);
}

玩得开心

答案 3 :(得分:0)

$arr = ...;
$final = array();
sort($arr);
foreach ($arr as $el) {
   if (!isset($prev) || $el !== $prev)
       $final[] = $el
    $prev = $el;
}

这是一个更有效的 1 解决方案(log n + n而不是二次方)但它依赖于数组的所有元素之间的总顺序,这可能是您没有的(例如,如果内部数组有对象)。

1 比使用in_array更有效率。结果array_unique实际上使用了这个算法,所以它有相同的缺点。

答案 4 :(得分:0)

要检查在多维数组上使用array_unique,您需要使用implode将其展平。

    $c=count($array)
    for($i=0;$i<$c;$i++)
    {
    $flattened=implode("~",$array[$i]);
    $newarray[$i]=$flattened;
     }
    if(count(array_unique($newarray)
    <count($newarray))
    {
    //returns true if $array contains duplicates
    //can also use array_unique on $newarray 
    //to remove   duplicates, then explode, 
    //to return to default state
    }

希望这有用,需要一段时间才能得到它。