0

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

想法?

更新

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

4

1 回答 1

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
于 2013-02-25T07:07:39.577 回答