2011-07-20 45 views
2

我有以下的数组:PHP多维数组发现在特定的尺寸重复

$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

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

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

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

使用数组作为查找表,并且键是'数字',您可以使用isset函数来测试数字是否曾经出现过。

示例伪代码:

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

这可能是我是什么寻找,但我会等待看看是否有其他人想出了一些不需要额外的数组写入的东西。谢谢。 –

+0

@Edgar Velasquez Lim好吧,如果你的独特数字少于1,000,000,那么你应该没问题。如果你不经常运行这些代码,那么它根本就不重要。在资源使用方面,使用阵列和查找密钥非常便宜。 – zaf

+0

同意,我的兴趣比任何事情都更有学术价值。 :) –

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]); 
}