循环遍历先前检测到的重复项并将它们合并到组中(PHP)


Looping through previously detected duplicates and merging them into groups (PHP)

我有超过1000000行,其中包含一些需要检测并分组的重复项。

分组看起来像这样(在数组中(:

0 -> 4123
3 -> 344,98222
10 -> 12,333423
12 -> 756
15 -> 1,10,30400

我需要做的是浏览这个列表,并为每组重复项分配一个组号。这里的问题是,一个键可能被分组到另一个键,但这个键并没有被分组回,而是再次被分组到前一个键。所有这些必须在同一组中。

使用我上面的例子,您可以看到10被分组为12,12被分组为756,15被分组为1,10和30400。这意味着10,12333423756,15,130400都需要在同一组中!

因此,我需要一个有效的方法来将一个数字应用于所有这些分组。即$group[10]=1; $group[12]=1; $group[333423]=1;,用于所有这些以及用于每个分组。

我必须找到一种有效的方法来做这件事,因为行太多了。它们只能真正循环通过一次。我试过用蛮力检查所有内容,但如果我必须迭代10000000*10000000,那么脚本永远不会结束,因为它的计算太多了。

这都是PHP,一切都在数组中。它现在不在MySQL数据库中,因为我不需要它。

想法?

更新

我自己想好了,看看我的答案。

我发现了:

$test[0]=array(4123);
$test[3]=array(344,98222);
$test[10]=array(12,333423);
$test[12]=array(756);
$test[15]=array(1,10,30400);
$ongroup=1;
$assigned=array();
$group=array();
$idlist=array_keys($test);
foreach($idlist as $id)
    {
    if (!isset($group[$id]))
        {
        $group[$id]=$ongroup;
        $assigned[$ongroup][0]=$id;
        $ongroup++;
        }
    foreach($test[$id] as $val)
        {
        if (!isset($group[$val])) {$group[$val]=$group[$id]; $assigned[$group[$id]][]=$val;}
        else
            {
            foreach($assigned[$group[$val]] as $val2)
                {
                $group[$val2]=$group[$id];
                $assigned[$group[$id]][]=$val2;
                }
            unset($assigned[$group[$val]]);
            $group[$val]=$group[$id];
            $assigned[$group[$id]][]=$val;
            }
        }
    }
foreach($group as $id => $val)
echo $id." = $val 'n";

结果:

0 = 1
4123 = 1
3 = 2
344 = 2
98222 = 2
10 = 4
12 = 4
333423 = 4
756 = 4
15 = 4
1 = 4
30400 = 4