删除关于一些特定索引的php数组重复项

时间:2010-11-25 21:59:56

标签: php arrays

假设我有一个带有100个子阵列的多维数组。子数组总是至少有3个索引,但可以有更多。我想从大数组中删除与这三个索引有关的其他重复的所有子数组。数组只有两个子数组的示例:

array(array(0 => 'a', 1=> 'b', 2 => 'c', 3 => 'd'), array(0 => 'a', 1=> 'b', 2=> 'c', 3=> 'z'))

其中一个子阵列将被删除,因为前3个索引匹配,即使第4个索引不匹配。

我正在寻找最优雅/最有效的解决方案。

3 个答案:

答案 0 :(得分:1)

/**
 * Create Unique Arrays using an md5 hash
 *
 * @param array $array
 * @return array
 */
function arrayUnique($array, $preserveKeys = false)
{
    $arrayRewrite = array();
    $arrayHashes = array();
    foreach($array as $key => $item) {
        $hash = md5(serialize($item));
        if (!isset($arrayHashes[$hash])) {
            $arrayHashes[$hash] = $hash;
            if ($preserveKeys) {
                $arrayRewrite[$key] = $item;
            } else {
                $arrayRewrite[] = $item;
            }
        }
    }
    return $arrayRewrite;
}

$uniqueArray = arrayUnique($array);
var_dump($uniqueArray);

FROM:http://www.phpdevblog.net/2009/01/using-array-unique-with-multidimensional-arrays.html

删除评论以激励他们访问网站 - 我曾经多次使用过这个评论。

希望有所帮助!

编辑:虽然不是这个特殊问题的解决方案,因为你需要匹配前3个索引,但它仍然是一个非常好的解决方案:如何在多维数组上使用array_unique()。

如果有人可以为你的目的弹出并编辑,那就更好了!

答案 1 :(得分:1)

Zenph得到了90%的权利,但他只希望将前3个元素视为独特的。您可以在序列化之前使用以下函数与Zenph的代码一起使用,只查看前三个元素。

function firstThree($array)
{
   $retArray = array();
   array_push($retArray, $array[1], $array[2], $array[3]);
   return $retArray;
}

答案 2 :(得分:0)

这样就可以了。由于带有静态变量的自由函数,不是最优雅的示例,但是通过使用lambda或类的实例作为回调目标,可以使其更加优雅。

function filter($subArray) {
    static $seenKeys = null;
    if ($seenKeys === null) {
        $seekKeys = array();
    }

    // I 'm just selecting the "three first" indexes here,
    // you can change it to better suit your needs
    $thisKey = serialize(array_slice($subArray, 0, 3));
    if (isset($seenKeys[$thisKey])) {
        return false;
    }
    else {
        return $seenKeys[$thisKey] = true;
    }
}

$result = array_filter($inputArray, 'filter');

我认为这个例子和PHP一样快,而不假设每个子数组中前三个项的类型和/或值。如果可以做出任何这样的假设,那么至少serialize调用可以用更合适的东西替换。我想这会加快这个过程。