2012-12-13 145 views
22
$result = array(
    0=>array('a'=>1,'b'=>'Hello'), 
    1=>array('a'=>1,'b'=>'other'), 
    2=>array('a'=>1,'b'=>'other'), 
); 

如果重複刪除它,所以結果如下:刪除重複關聯數組在PHP

$result = array(
    0=>array('a'=>1,'b'=>'Hello'), 
    1=>array('a'=>1,'b'=>'other') 
); 

可以在任何知道做到這一點?

感謝

+0

是什麼使得它複製一個'='&'B = other'或只是'B = other' ... – Baba

+0

'了'和'B' @ Bada謝謝 – kn3l

+0

http://stackoverflow.com/questions/3767318/how-to-remove-duplicate-values-from-an-associative-array-based-on-a-specific-val –

回答

16

首先第一件事情,你不能對這個問題使用純array_unique因爲array_unique內部對待數組項爲字符串,這就是爲什麼「不能數組轉換爲字符串」通知使用array_unique這個時候會出現。

那麼試試這個:

$result = array(
    0=>array('a'=>1,'b'=>'Hello'), 
    1=>array('a'=>1,'b'=>'other'), 
    2=>array('a'=>1,'b'=>'other') 
); 

$unique = array_map("unserialize", array_unique(array_map("serialize", $result))); 

print_r($unique); 

結果:

Array 
(
    [0] => Array 
     (
      [a] => 1 
      [b] => Hello 
     ) 

    [1] => Array 
     (
      [a] => 1 
      [b] => other 
     ) 

) 

序列化是對這類問題非常方便。

如果你覺得這是太多神奇你,看看這個blog post

function array_multi_unique($multiArray){ 

    $uniqueArray = array(); 

    foreach($multiArray as $subArray){ 

    if(!in_array($subArray, $uniqueArray)){ 
     $uniqueArray[] = $subArray; 
    } 
    } 
    return $uniqueArray; 
} 

$unique = array_multi_unique($result); 

print_r($unique); 

諷刺的是,in_array正在爲陣列,其中array_unique沒有。

+3

那麼,實際上'array_unique'是精細。看到我的回答:http://stackoverflow.com/a/13860140/367456 – hakre

38

無論別人在這裏提供什麼,你正在尋找一個叫array_uniqueDocs的功能。這裏最重要的是第二個參數設置爲SORT_REGULAR然後工作很簡單:

array_unique($result, SORT_REGULAR); 

SORT_REGULAR標誌的含義是:

比較項目正常(不改變類型)

這就是你想要的。這裏您想要​​,並且不要將它們的類型更改爲字符串(如果未設置參數,這將是默認值)。

array_unique做了嚴格的比較(===在PHP),爲陣列,這意味着:

$a === $bTRUE如果$ a和$ b具有相同的鍵/值對以相同的順序和相同類型的。

輸出(Demo):

Array 
(
    [0] => Array 
     (
      [a] => 1 
      [b] => Hello 
     ) 

    [1] => Array 
     (
      [a] => 1 
      [b] => other 
     ) 
) 
+0

很酷,didmt知道,第二個參數是可用的。l –

+1

@DavidMüller:手冊總是值得一看;)至少我這樣做,如果它是具體的。你無法知道每個函數的進出。 – hakre