我有超过1,000,000行,其中包含一些需要检测并组合在一起的重复项。
分组看起来像这样(在数组中):
0 -> 4123
3 -> 344,98222
10 -> 12,333423
12 -> 756
15 -> 1,10,30400
我需要做的是浏览此列表并为每组重复项分配一个组号。这里的问题是一个密钥可能被分组到另一个密钥,但是这个密钥不会被分组,而是再次分组到另一个密钥。所有这些必须属于同一组。
使用上面的例子,你可以看到10被分组为12,12被分组为756,15被分组为1,10和30400.这意味着10,12,333423,756,15,1 ,30400都需要在同一组!
所以我需要一种有效的方法来将数字应用于所有这些分组。即$group[10]=1; $group[12]=1; $group[333423]=1;
用于所有这些以及每个分组。
我必须找到一种有效的方法,因为行数太多了。它们只能真正循环一次。我已经尝试过使用强力检查所有内容,但如果我必须遍历1,000,0000 * 1,000,0000,那么脚本将永远不会因为它的计算过多而结束。
这是所有PHP,一切都在数组中。此时它不在MySQL数据库中,因为我不需要它。
想法?
更新
我自己想出来,看到我的答案。
答案 0 :(得分:0)
我明白了:
$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