2011-02-09 97 views
4

我对多维数组有这个问题。PHP:检查多维数组中的重复值

鉴于以下多维数组:

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") 
    ) 

我该怎么做?

回答

11

这将使用array_unique()删除您阵列重复的项目:

$new_arr = array_unique($arr, SORT_REGULAR); 
+0

-1查看文档。这将比较之前将数组的值转换为字符串。 – Artefacto 2011-02-09 18:47:24

+0

@艺术品:看文档。我使用不使用字符串比较的`SORT_REGULAR`标志。 – 2011-02-09 18:48:03

2

你可以简单地做它用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" 
    } 
} 
0
$arr = ...; 
$final = array(); 
sort($arr); 
foreach ($arr as $el) { 
    if (!isset($prev) || $el !== $prev) 
     $final[] = $el 
    $prev = $el; 
} 

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

比使用in_array更有效率。结果发现array_unique实际上使用这种算法,所以它具有相同的缺点。

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); 
} 

玩得开心

0

要检查使用array_unique的多维数组,你需要压平像这样,使用破灭。

$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 
    } 

希望这是有帮助的,需要一段时间才能得到它。