数组几乎是唯一标准

时间:2012-02-21 04:31:17

标签: php arrays loops unique

如何正确制作像这样的阵列是唯一的? (并且我的意思是只删除了数组[3],因为它是数组[2]的副本)

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

但这次对我的原因没有帮助。

数组中没有唯一值(单独),但每个二级数组的值组合是唯一的。

4 个答案:

答案 0 :(得分:4)

试试这个......

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

答案 1 :(得分:2)

当然有人会用更好的解决方案来打败我,但这很简单。您所做的就是通过连接所有元素来“散列”原始数组,然后跟踪哪些元素已添加到该组唯一输入中。如果原始数组的'hashed'(连接值)尚未添加到哈希数组中,则只添加原始数组。

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

答案 2 :(得分:1)

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

您甚至可以放弃md5以加快流程。

答案 3 :(得分: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));