2011-02-09 105 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 
    } 

希望這是有幫助的,需要一段時間才能得到它。