2012-02-21 77 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