假设我有一个带有100个子阵列的多维数组。子数组总是至少有3个索引,但可以有更多。我想从大数组中删除与这三个索引有关的其他重复的所有子数组。数组只有两个子数组的示例:
array(array(0 => 'a', 1=> 'b', 2 => 'c', 3 => 'd'), array(0 => 'a', 1=> 'b', 2=> 'c', 3=> 'z'))
其中一个子阵列将被删除,因为前3个索引匹配,即使第4个索引不匹配。
我正在寻找最优雅/最有效的解决方案。
答案 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
调用可以用更合适的东西替换。我想这会加快这个过程。