我有以下数组:
$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)
这令人震惊,令人难以置信的脑死亡。我的问题是,最好的方法是什么?我不是在寻找代码本身,而是解决问题。对于那些已经读过这篇文章的人,谢谢。
答案 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]);
}