【问题标题】:PHP array comparision errorPHP数组比较错误
【发布时间】:2018-03-08 05:24:39
【问题描述】:

我的 PHP 中有 2 个 SELECT 语句。两个选择语句都从两个不同的数据库中获取数据。获取的数据保存在 PDO Assoc Array 中。问题是当我想比较这两个数组以发现两个数组中是否存在列“id”时。如果存在则忽略它。如果它是唯一的 id,则将其保存到第三个数组中。但是我在下面的逻辑中发现了一些问题

在运行以下代码后,我遇到了几个错误: 1:数组到字符串的转换 2:重复键值违反唯一约束

$arr1 = $msql->fetchAll(PDO::FETCH_ASSOC);
$array1 = array();
foreach($arr1 as $x){
$array1[] = $x['id'];
}


$arr2 = $psql->fetechAll(PDO::FETCH_ASSOC);
$array2 = array();
foreach($arr2 as $y){
  $array2[] = $y['id'];
 }

$finalarray = array();
for ($i = 0; $i < count($arr1); $i++){
if(count(array_intersect($array1,$array2)) <= 1){// is the count of id is 1 or less save that whole row in the $finalarray
      $finalarray = $arr1[$i]; // saving the unique row.
}
else{
    continue;
}
}

在比较它们的 id 列之后,我正在尝试获取唯一的数据 array() 行。

【问题讨论】:

  • 你问过类似的问题here,应该编辑同样的问题。请立即删除旧帖子
  • 谢谢。
  • 报错在哪一行?
  • @Gufran Hasan 修复后代码运行良好。但是当插入数据时数据库中已经存在重复而无法完全执行查询时,就会出现错误。
  • 那么您应该在分配时防止$array1$array2 中的重复条目或使用array_unique 到$finalarray

标签: php arrays associative-array


【解决方案1】:

您可以使用in_array() function,因为这两个数组都是索引数组。

$finalarray = array();
for ($i = 0; $i < count($arr1); $i++){
if(count(array_intersect($array1,$array2)) <= 1){// is the count of id is 1 or less save that whole row in the $finalarray
      $finalarray = $arr1[$i]; // saving the unique row.
}
else{
    continue;
}
}

修改代码:

$finalarray = array();
for ($i = 0; $i < count($arr1); $i++){
if(!in_array($array1[$i], $array2)){
      $finalarray[] = $array1[$i]; // saving the unique row.
}

}

【讨论】:

  • 应该是:$finalarray[] = $array1[$i];,也不需要继续
  • @Gufran Hasan 我在 if 语句中遇到语法错误?
  • 我已经更新了我的 amswer 请再次检查它希望它会像你正在寻找的那样工作
  • @GufranHasan 我不知道为什么但仍然向我抛出一个存在唯一值的错误然后停止插入?
  • @GufranHasan 错误:唯一违反:7 错误:重复键值违反唯一约束
【解决方案2】:

您可以简单地使用array_intersect() 来获取两个数组之间的公共值。差异,可以使用array_diff()

$array1 = [1,2,3,4,5,6,7];
$array2 = [2,4,6];
//array_intersect — Computes the intersection of arrays
$result = array_intersect($array1, $array2);
print_r($result);
//array_diff — Computes the difference of arrays
$result = array_diff($array1, $array2);
print_r($result);

DEMO

【讨论】:

    【解决方案3】:

    您可以使用一个数组来完成,而不是使用 3 个不同的数组来获取唯一 ID。对您的代码进行如下更改:

    $finalarray = array();
    
    $arr1 = $msql->fetchAll(PDO::FETCH_ASSOC);
    foreach($arr1 as $x){
        if (!in_array($x['id'],$finalarray)) { // check id is already stored or not       
            $finalarray[] = $x['id'];
        }
    }
    
    
    $arr2 = $psql->fetechAll(PDO::FETCH_ASSOC);
    foreach($arr2 as $y){  
        if (!in_array($y['id'],$finalarray)) { // check id is already stored or not       
            $finalarray[] = $y['id'];
        }
    }
    

    【讨论】:

      【解决方案4】:

      也许您应该在循环之前确定哪个数组更大;

      或者使用array_diff:

      $finalarray = array_diff($array1 , $array2) ?? [];
      $finalarray = array_merge( array_diff($array2 , $array1) ?? [], $finalarray );
      

      【讨论】:

      • 我的 array1() 总是比 array2() 大
      猜你喜欢
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多