2015-02-06 106 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]); 
     } 
    } 
}