我有以下数组:
$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]);
}