2015-02-06 108 views
0

我基本上試圖比較Array1和Array2來查找匹配的行。但是,這兩個數組都有大約14000行(來自sql表),所以我認爲一旦找到刪除array2中匹配的行是合乎邏輯的,以減少總體迭代次數。在PHP中從嵌套的foreach中刪除數組的值

它看起來是這樣的:

foreach($array1 as $arrayRow){ 
    foreach($array2 as $array2Row){ 
     if($arrayRow['ID'] == $array2Row['ID']{ 
     $matchfound = 1; 
     unset($array2,$array2Row); 
     } 
    } 
} 

但是貌似,運行上面的代碼時沒有任何反應都沒有。

注:陣列1和2中的數據來自兩個獨立的數據庫,以及我無法同時運行(因此不必做這在PHP)上都查詢

+0

使用sql爲此。 – sectus 2015-02-06 12:04:50

+0

數組1和數據2來自兩個獨立的數據庫,並且我無法同時運行查詢 – Shuma 2015-02-06 12:06:38

回答

2

似乎代碼將取消設置$ array2本身,以及循環內行的本地副本($ array2Row)。取而代之,獲取要取消設置的行的密鑰,並直接取消設置:

foreach($array1 as $arrayRow){ 
    foreach($array2 as $key => $array2Row){ 
     if($arrayRow['ID'] == $array2Row['ID']{ 
      $matchfound = 1; 
      unset($array2[$key]); 
     } 
    } 
} 
+0

這似乎是行得通的,謝謝! – Shuma 2015-02-06 12:16:48

+0

@Shuma看看我的解決方案下面,如果你喜歡 – Kleskowy 2015-02-06 12:19:00

1

如果條件存在,缺少「)」。你可以運行它正在工作的代碼。

foreach($array1 as $arrayRow){ 
    foreach($array2 as $array2Row){ 
     if($arrayRow['ID'] == $array2Row['ID']){ 
     $matchfound = 1; 
     unset($array2,$array2Row); 
     } 
    } 

}

0

檢查此解決方案未設置匹配數組元素

//Array1 is $array1 
//Array2 is $array2 
foreach($array1 as $key => $value){ 
if(in_array($value,$array2)){ 
    unset($array2[$key]); 
    } 
} 
0

如果你需要找到使用SQL沒有匹配的行,只是把結果關聯數組與ID爲鍵,然後使用array_instersect_key()

這應該是做的最快的方法,因爲你必須在每個數組中〜14K的條目 - 我用下面的解決方案去:

$array1 = $array2 = array(); 
//I assume $query1Result and $query2Result are results of sql queries from 2 databases 

//put rows in arrays with ID as key 
while ($row = mysqli_fetch_assoc($query1Result)) { 
    $array1[$row['ID']] = $row; // ID is the key in array 
} 

while ($row = mysqli_fetch_assoc($query2Result)) { 
    $array2[$row['ID']] = $row; // ID is the key in array 
} 

//then use this to compute the intersection 
$intersected = array_intersect_key($array1, $array2); 
+0

謝謝,這是有趣的閱讀。我需要做的完整版本包括比較每行中的每個關鍵字=>值,以確切匹配 – Shuma 2015-02-06 12:36:48

0

你應該使用PHP的$key => $value args來的foreach函數,所以代碼會是這樣的:

$matchFound = 0; 
foreach($array1 as $arrKey1 => $arrVal1) { 
    foreach($array2 as $arrKey2 => $arrVal2) { 
     if ($array1[$arrKey1]['ID'] == $array2[$arrKey2]['ID']) { 
      $matchFound = $matchFound + 1; 
      unset($array2[$arrVal2]); 
     } 
    } 
}