PHP多维数组在特定维度中查找重复项

时间:2011-07-20 06:20:52

标签: php mysql arrays multidimensional-array performance

我有以下数组:

$masterlist=[$companies][$fieldsofcompany][0][$number]

如果从$fieldsofcompany =位置2中选择包含数字数组的字段,则仅存在第三维。其他职位包含常规变量。第三维始终为0(数字数组)或Null。位置4包含数字。

我想循环浏览所有公司,并从$masterlist所有包含重复号码的公司中删除。

我目前的实现是这段代码:

for($i=0;$i<count($masterlist);$i++)
    {   
        if($masterlist[$i][2][0][0] != null)

        $id = $masterlist[$i][0];

        for($j=0;$j<count($masterlist[$i][2][0]);$j++)
        {
            $number = $masterlist[$i][2][0][$j];

            $query = "INSERT INTO numbers VALUES('$id','$number')";
            mysql_query($query);
        }
    }

将数字和关联的ID插入表中。然后我选择这样的唯一数字:

SELECT ID,number
FROM numbers
GROUP BY number
HAVING (COUNT(number)=1)

这令人震惊,令人难以置信的脑死亡。我的问题是,最好的方法是什么?我不是在寻找代码本身,而是解决问题。对于那些已经读过这篇文章的人,谢谢。

2 个答案:

答案 0 :(得分:2)

对于初学者,您应该在将数据粘贴到数据库之前修剪数据。

保持一个查找表,跟踪&#39;。

如果数字不在查找表中,则使用它并标记它,否则如果它在查找表中你可以忽略它。

使用数组作为查找表,键是&#39;数字&#39;您可以使用isset函数来测试数字是否已经出现过。

伪代码示例:

if(!isset($lookupTable[$number])){
    $lookupTable[$number]=1;
    //...Insert into database...
}

答案 1 :(得分:1)

既然我认为我理解你真正想要的东西,你可能想要坚持你的两次通过方法但跳过MySQL绕道而行。

在第一遍中,收集数字和重复的公司:

$duplicate_companies = array();
$number_map = array();

foreach ($masterlist as $index => $company)
{
    if ($company[2][0][0] === null)
        continue;

    foreach ($company[2][0] as $number)
    {
        if (!isset($number_map[$number])
        {
            // We have not seen this number before, associate it
            // with the first company index.
            $number_map[$number] = $index;
        }
        else
        {
            // Both the current company and the one with the index stored
            // in $number_map[$number] are duplicates.
            $duplicate_companies[] = $index;
            $duplicate_companies[] = $number_map[$number];
        }
    }
}

在第二遍中,删除我们在主列表中找到的重复项:

foreach (array_unique($duplicate_companies) as $index)
{
    unset($masterlist[$index]);
}