【问题标题】:Comparing two arrays with different key names比较具有不同键名的两个数组
【发布时间】:2014-01-14 18:04:41
【问题描述】:

我需要比较两个包含来自 mySQL 表的值的数组,然后确定不在这两个数组之一中的值。我遇到的问题是两个数据库表上的字段名称不同,我正在努力研究如何提取值并比较两者。

我将列出与此相关的所有代码 - 希望有人能够提供帮助。

首先,对 MySQL 数据的初始调用

$sql1 = "SELECT modname FROM users_modules WHERE email='$email'";
$result1 = $conn->query($sql1);
while ($row = $result1->fetch_assoc()){
   $indMods[] = $row;
}

$sql2 = "SELECT module, mod_name, level FROM modules WHERE level = '$level'";
$result2 = $conn->query($sql2);
while ($row2 = $result2 -> fetch_assoc()){
   $allMods[] = $row2;
}

这将返回以下两个数组:

$indMods数组

array(5) {
  [0]=>
  array(1) {
    ["modname"]=>
    string(3) "302"
  }
  [1]=>
  array(1) {
    ["modname"]=>
    string(3) "303"
  }
  [2]=>
  array(1) {
    ["modname"]=>
    string(3) "304"
  }
  [3]=>
  array(1) {
    ["modname"]=>
    string(3) "305"
  }
  [4]=>
  array(1) {
    ["modname"]=>
    string(3) "306"
  }
}

$allMods数组

array(10) {
  [0]=>
  array(3) {
    ["module"]=>
    string(3) "301"
    ["mod_name"]=>
    string(42) "3.01 Introduction to Facilities Management"
    ["level"]=>
    string(1) "3"
  }
  [1]=>
  array(3) {
    ["module"]=>
    string(3) "302"
    ["mod_name"]=>
    string(35) "3.02 CSR & Sustainability in FM"
    ["level"]=>
    string(1) "3"
  }
  [2]=>
  array(3) {
    ["module"]=>
    string(3) "303"
    ["mod_name"]=>
    string(47) "3.03 Customer & Stakeholder Relations in FM"
    ["level"]=>
    string(1) "3"
  }
  [3]=>
  array(3) {
    ["module"]=>
    string(3) "304"
    ["mod_name"]=>
    string(39) "3.04 FM Specification & Procurement"
    ["level"]=>
    string(1) "3"
  }
  [4]=>
  array(3) {
    ["module"]=>
    string(3) "305"
    ["mod_name"]=>
    string(41) "3.05 Health & Safety Responsibilities"
    ["level"]=>
    string(1) "3"
  }
  [5]=>
  array(3) {
    ["module"]=>
    string(3) "306"
    ["mod_name"]=>
    string(44) "3.06 Project Management within FM Operations"
    ["level"]=>
    string(1) "3"
  }
  [6]=>
  array(3) {
    ["module"]=>
    string(3) "307"
    ["mod_name"]=>
    string(25) "3.07 FM Budget Management"
    ["level"]=>
    string(1) "3"
  }
  [7]=>
  array(3) {
    ["module"]=>
    string(3) "308"
    ["mod_name"]=>
    string(45) "3.08 FM within the context of an organisation"
    ["level"]=>
    string(1) "3"
  }
  [8]=>
  array(3) {
    ["module"]=>
    string(3) "311"
    ["mod_name"]=>
    string(31) "3.11 Building Maintenance in FM"
    ["level"]=>
    string(1) "3"
  }
  [9]=>
  array(3) {
    ["module"]=>
    string(3) "313"
    ["mod_name"]=>
    string(46) "3.13 Disaster Recovery & Contingency Plans"
    ["level"]=>
    string(1) "3"
  }
}

我想从$allMods 中提取数据,其中module 值不存在于$indMods 数组的modname 值中

谁能帮忙?

谢谢

【问题讨论】:

    标签: php mysql arrays


    【解决方案1】:

    为其中一个或两个字段指定别名,以便它们匹配键:

    $sql1 = "SELECT modname AS module FROM users_modules WHERE email='$email'";
    

    现在有一个module 的键,而不是modname

    只要结构相似,就可以使用array_diff来查找数组之间的差异。在您的情况下,这将从您的第二个数据库查询中删除其他两个键。

    例如:

    $sql1 = "SELECT modname AS module FROM users_modules WHERE email='$email'";
    $result1 = $conn->query($sql1);
    while ($row = $result1->fetch_assoc()){
       $indMods[] = $row;
    }
    
    $sql2 = "SELECT module FROM modules WHERE level = '$level'";
    $result2 = $conn->query($sql2);
    while ($row2 = $result2 -> fetch_assoc()){
       $allMods[] = $row2;
    }
    
    $difference = array_diff($indMods, $allMods);
    

    PHP 的 array_diff: http://php.net/manual/en/function.array-diff.php 的文档

    请注意,有很多方法可以做到这一点。这只是一个。

    【讨论】:

      【解决方案2】:
      $x = [];
      foreach ($indMods as $v) {
        array_push($x, $v['modname']);
      }
      
      $extracted = [];
      foreach ($allMods as $k => $v) {
        $modValue = $v['module'];
        if (!in_array($modValue, $x)) {
          array_push($extracted, $v);
        }
      }
      
      var_dump($extracted);
      

      【讨论】:

        猜你喜欢
        • 2016-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-02
        • 2021-06-16
        • 2022-01-18
        相关资源
        最近更新 更多