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

时间:2013-02-25 06:30:24

标签: php

我有超过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数据库中,因为我不需要它。

想法?

更新

我自己想出来,看到我的答案。

1 个答案:

答案 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