PHP - 如何测试一个多维数组是否存在任意顺序的重复元素值

3

我不确定标题是否真正传达了我的问题,所以这是我要做的事情:

我有一个由四个整数元素组成的数组数组,例如。

Array(Array(1,2,3,4), Array(4,2,3,1), Array(18,3,22,9), Array(23, 12, 33, 55))

我需要移除其中一个包含相同值的数组,比如上面例子中的索引0和1。

当只有两个元素需要检查时,使用这个问题中最佳答案的代码可以很容易地实现。

我的多维数组在任何时候都可能有1-10个数组,因此我无法找到处理这种结构并移除具有任意顺序相同数字的数组的最佳方法。

非常感谢!

1个回答

4

我一直在思考这个问题,我认为使用一个设计良好的闭包array_filter一起使用可能是我解决这个问题的方式:

$matches = array();
$array = array_filter($array, function($ar) use (&$matches) {
    sort($ar);
    if(in_array($ar, $matches)) {
        return false;
    }
    $matches[] = $ar;
    return true;
});

看这里,有一个例子:http://ideone.com/Zl7tlR 编辑:$array将是你的最终结果,忽略$matches,因为它只在过滤闭包期间使用。

那看起来像是个很好的答案,但是我刚刚运行了一下,结果得到了相同的数组? - Scriptable
这个 ideone 的例子似乎是可以工作的。你能告诉我你输入了什么吗? - Scopey
啊,抱歉。我复制错了,我应该用$array而不是$ar - Scriptable
非常好的答案,但是我好像得到了不在原始数组中的匹配项。$array = [[11,18,22,43],[42,21,38,23],[28,33,17,32],[12,25,38,22],[11,22,43,18],[12,14,17,19],[34,23,11,32],[21,33,42,45],[1,2,8,23],[8,2,1,23]]$matches = [[11,18,22,43],[21,23,38,42],[17,28,32,33],[12,22,25,38],[12,14,17,19],[11,23,32,34],[21,33,42,45],[1,2,8,23]]我已经想出了一些东西,看起来能够给我所期望的结果,虽然我知道这并不高效。稍后我会把它发布为答案。 - Spectre
我在我的回答中没有注明,但$array包含过滤器的结果。$matches仅用于过滤器。它实际上最终将包含所有匹配值,除了它们将被排序。 - Scopey
@Spectre 这是一个使用您回答中提供的输入示例:http://ideone.com/aLfPbZ - Scopey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接