删除与几个特定索引相关的php数组重复项

删除与几个特定索引相关的php数组重复项,php,arrays,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个索引不匹配

假设我有一个多维数组,有100个子数组。子数组始终至少有3个索引,但可以有更多索引。我想从大数组中删除所有子数组,这些子数组与其他子数组在这三个索引方面是重复的。仅包含两个子阵列的阵列示例:

array(array(0 => 'a', 1=> 'b', 2 => 'c', 3 => 'd'), array(0 => 'a', 1=> 'b', 2=> 'c', 3=> 'z'))
其中一个子数组将被删除,因为前3个索引匹配,即使第4个索引不匹配

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

/**
 * 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);
发件人:

删除评论以鼓励人们访问该网站-我已经在一些场合使用过

希望有帮助

EDIT:虽然这不是一个解决这个特定问题的方法,因为您需要匹配前3个索引,但它仍然不是一个解决一般问题的很好方法:如何在多维数组上使用array_unique()


如果有人能为你的目的进行编辑,那就更好了

Zenph 90%正确,但他只想把前3个元素看作是独一无二的。您可以在序列化之前将下面的函数与Zenph的代码结合使用,只查看前三个元素

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

这样就行了。由于free函数带有一个静态变量,这不是最优雅的示例,但是您可以通过使用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中最快的一个例子,无需假设每个子数组中前三项的类型和/或值。如果可以做出任何这样的假设,那么至少可以用更合适的方法替换
序列化
调用。我想这会大大加快这个过程。

那么,如果这两个选项都被删除了,那么是哪一个呢?K,我会自己修改它。为什么PHP没有像array\u unique\u custom(compare\u callback,array)这样的函数。您可以在何处提供用于比较不同索引的回调?此示例可以通过多种方式进行改进,但也存在一个重大错误:由于
md5
调用,除非事先知道子数组中键和项的类型和值的所有可能排列,否则无法保证此函数将正常运行。