我有超过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