从PHP中的嵌套foreach中删除数组值


Removing an array value from nested foreach in PHP

我实际上是在尝试比较Array1和Array2,以找到匹配的行。然而,这两个数组都有大约14000行(来自sql表),所以我认为一旦找到数组2中的匹配行,就删除它是合乎逻辑的,以减少总体迭代次数。

它看起来像这样:

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

然而,在运行上述代码时,似乎什么都没有发生。

注意:数组1和2的数据来自两个独立的数据库,我无法同时对这两个数据库运行查询(因此必须在php中执行此操作)

代码似乎将取消设置$array2本身以及循环中行的本地副本($array2Row)。相反,获取要取消设置的行的密钥,然后直接取消设置条目:

foreach($array1 as $arrayRow){
    foreach($array2 as $key => $array2Row){
        if($arrayRow['ID'] == $array2Row['ID']{
           $matchfound = 1;
           unset($array2[$key]);
        }
    }
}
if条件中缺少")"。你可以运行这个代码,它正在工作。
foreach($array1 as $arrayRow){
    foreach($array2 as $array2Row){
       if($arrayRow['ID'] == $array2Row['ID']){
       $matchfound = 1;
       unset($array2,$array2Row);
      }
  }

}

检查此解决方案以取消设置匹配的数组元素

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

如果您需要在不使用SQL的情况下找到匹配的行,只需将结果放在以ID为键的关联数组中,然后使用array_intersect_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);

您应该使用foreach函数的php的$key => $value参数,因此代码如下所示:

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