比较具有不同键名的两个数组

时间:2014-01-14 18:04:42

标签: php mysql arrays

我需要比较两个包含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数据{/ 1}}值中不存在modname值的数据

有人可以帮忙吗?

由于

2 个答案:

答案 0 :(得分:3)

为其中一个或两个字段添加别名,以便按键匹配:

$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_diffhttp://php.net/manual/en/function.array-diff.php

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

答案 1 :(得分:0)

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