2011-07-20 11 views
2

I以下の配列を有する:PHP多次元アレイは、特定の寸法に重複を見つける

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

$fieldsofcompany =位置2から選択されたフィールドが数値の配列を含む場合に三次元にのみ存在します。他の位置には通常の変数が含まれます。 3次元目は常に0(数値配列)またはNullです。ポジション4は数字を含む。

私は全企業を巡回し、重複番号を含むすべての企業$masterlistから削除したいと考えています。テーブルに数字と関連IDを挿入し

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

私の現在の実装では、このコードです。次のように一意の番号を選択します。

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

これは私を信じられないほど脳死にします。私の質問は、これを行うための最善の方法は何ですか?私はコード自体は探していませんが、問題に近づいています。これまでに読んだことのある人のために、ありがとう。

答えて

2

まず、データをデータベースに貼り付ける前にプルーニングする必要があります。

「番号」を記録するルックアップテーブルを保持します。

ルックアップテーブルに番号がない場合は、それを使用してマークし、そうでない場合は、ルックアップテーブルでその番号を無視できます。

ルックアップテーブル用の配列を使用し、キーが 'number'の場合、isset関数を使用して数が前に出現しているかどうかをテストできます。

例の擬似コード:

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

これは、私はおそらく何です探していますが、他の誰かが追加の配列書き込みを必要としないものが出てくるのを見るのを待つつもりです。ありがとう。 –

+0

@Edgar Velasquez Limまあ、もしあなたが1,000,000以下のユニークな数字を持っていれば、あなたはこのテクニックで大丈夫でしょう。このコードを頻繁に実行しないと、まったく問題になりません。キーを使用してアレイとルックアップを使用することは、リソースの使用量に関して非常に安価です。 – zaf

+0

同意すると、私の興味は今のところ何よりも学問的です。 :) –

1

今、私は私はあなたが本当に欲しいものを理解だと思うことを、あなたは2パスアプローチに固執したが、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]); 
} 
関連する問題