2012-02-21 49 views
1

我如何正確地使這樣一個數組是獨一無二的? (並且由唯一的我的意思是,因爲它是陣列的重複的[2]僅在陣列[3]被移除)陣列幾乎獨特的標準

array(
array("Title", 50, 96), 
array("Other Title", 110, 225), 
array("Title", 110, 225), 
array("Title", 110, 225), 
) 

我想在這種情況下被過濾掉的唯一陣列是最後一個(在這種情況),但沒有特定的順序,而手工勞動也不會削減它。 (彈出一個有針對性的位置)。這是一個相當大的陣列,我也必須考慮這裏的表現。

我也可以安排的數據是這樣的:

array(
array("Title" => array(50, 96), array(110, 225)) 
array("Other Title", array(110, 225)) 
) 

但是,這並不能幫助我的事業這個時候。

數組中沒有唯一值(單獨),但每個第二級數組的值組合是唯一的。

回答

1
$array = array(array("Title", 50, 96), array("Other Title", 110, 225), array("Title", 110, 225), array("Title", 110, 225)); 

function remove_duplicates_multi_array($array) { 

    $serialized_arrays = array(); 
    // serialize every array 
    foreach ($array as $key=>$value) { 
     $serialized_arrays[$key] = serialize($value); 
    } 
    // use array_unique to remove duplicates 
    $unique_array = array_unique($serialized_arrays); 

    $multi_unique = array(); 

    //unserialize every item inside the array 
    foreach($unique_array as $key=>$value) { 
     $multi_unique[$key] = unserialize($value); 
    } 

    return $multi_unique; 
} 

var_dump(remove_duplicates_multi_array($array)); 
2

當然有人會擊敗我w /一個更好的表演解決方案,但這是一個簡單的。你所做的就是通過連接它們的所有元素來「哈希」原始數組,然後跟蹤哪些數據已被添加到唯一輸入集中。如果「哈希」(連續值)尚未添加到哈希數組中,則只能添加原始數組。

$aMain = array(
array("Title", 50, 96), 
array("Other Title", 110, 225), 
array("Title", 110, 225), 
array("Title", 110, 225), 
); 

$_aHashed = array(); 
$aUniqued = array(); 
foreach($aMain as $aUnhashed) { 
    $sHash = implode('', $aUnhashed); 
    if(!in_array($sHash, $_aHashed)) { 
     $_aHashed[] = $sHash; 
     $aUniqued[] = $aUnhashed; 
    } 
} 

var_dump($aUniqued); 
1
$filtered = array(); 
foreach ($array as $entry) { 
    $hash = md5(serialize($entry)); 
    $filtered[$hash] = $entry; 
} 

你甚至應該能夠離開關md5以加快這一進程。

4

試試這個.....

$input = array_map("unserialize", array_unique(array_map("serialize", $input))); 
+0

聰明。 :)但可能相當昂貴。 – deceze 2012-02-21 05:02:06

+0

我也喜歡:)) – Vyktor 2012-02-21 05:16:10