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



我有以下数组:

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

第三维仅存在于从$fieldsofcompany = position 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)

这让我感到难以置信的脑死亡。我的问题是,最好的方法是什么?我不是在寻找代码本身,而是在寻找解决问题的方法。对于那些读到这里的人,谢谢。

对于初学者来说,应该在将数据插入数据库之前对其进行修剪。

保持一个查找表,跟踪'number'。

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

使用数组作为查找表,键值为'number',可以使用isset函数来测试该数字之前是否出现过。

伪代码示例:

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

现在我想我知道你真正想要的是什么,你可能想要坚持你的两步方法,但跳过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]);
}

相关内容

  • 没有找到相关文章

最新更新