Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用包含两个元素的数组在php中获得数组差异_Php_Arrays - Fatal编程技术网

如何使用包含两个元素的数组在php中获得数组差异

如何使用包含两个元素的数组在php中获得数组差异,php,arrays,Php,Arrays,因此,我有两个查询将从数据库中提取数据。但是,我需要使用这些数据通过php获得数组差异。我想将employeeName和designation都发送到一个数组中,然后得到差异。我使用的以下代码无法按预期工作。这件事有什么解决办法吗 <?php header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json; charset=UTF-8"); include_once 'config.php

因此,我有两个查询将从数据库中提取数据。但是,我需要使用这些数据通过php获得数组差异。我想将employeeName和designation都发送到一个数组中,然后得到差异。我使用的以下代码无法按预期工作。这件事有什么解决办法吗

<?php

header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");

include_once 'config.php';

$sql1 = "SELECT employeeName, designation FROM t2o_mappings WHERE type = '". $_GET['type'] ."' AND employeeCompany = '".$_GET['employeeCompany']."'"; //System Data;
$sql2 = "SELECT employeeName, designation FROM mappings_view WHERE uNo = '" . $_GET['uNo'] . "' AND uCompany = '" . $_GET['uCompany'] . "' AND type = '". $_GET['type'] ."' AND employeeCompany = '".$_GET['employeeCompany']."'"; //App Data;
//WHERE uNo = '".$_GET['uNo']."' AND uCompany = '".$_GET['uCompany']."'

$result1 = sqlsrv_query($conn, $sql1);
$result2 = sqlsrv_query($conn, $sql2);

$row1 = [];
$row2 = [];

while ($rs1 = sqlsrv_fetch_array($result1, SQLSRV_FETCH_ASSOC)) {

    $row1[] = $rs1['employeeName, designation'];
}

while ($rs2 = sqlsrv_fetch_array($result2, SQLSRV_FETCH_ASSOC)) {

    $row2[] = $rs2['employeeName, designation'];
}

print_r($row1);
print_r($row2);

$HaveSysNoApp = array_diff($row1, $row2);  //Have in System, Not in App
$HaveAppNoSys = array_diff($row2, $row1); //Have in App, Not in System

echo 'HaveSysNoApp';
print_r($HaveSysNoApp);
echo '$HaveAppNoSys';
print_r($HaveAppNoSys);

?>

这里有语法问题

$row1[] = $rs1['employeeName, designation'];
正确的方法是:

$row1[] = [
    $rs1['employeeName'],
    $rs1['designation']
];
但是
array_diff()
抛出了“数组到字符串的转换”通知,因为它只能处理一维:

注意:

当且仅当(字符串)$elem1==(字符串)$elem2时,两个元素被视为相等。换句话说:当字符串表示形式相同时

由于要比较多维数组,因此可以使用函数

例如:

$HaveSysNoApp = array_filter($row1, function ($item) use ($row2) {
    return !in_array($item, $row2);
});

您可以使用此查询直接在数据库中执行此操作(相反的检查类似):

这些问号使其成为参数化查询,从而防止SQL注入(参数值不是查询的一部分,因此它们不能更改其含义)。您可以使用其他参数数组调用它(顺序必须匹配):


“我使用的下面的代码没有按预期工作”,这是什么意思?到底什么不起作用?你给出的解决方案是正确的,但它与数组差分函数不起作用,我得到的错误是“注意:第38行上的数组到字符串转换”@AndrewJeromeBernard我编辑了我的答案。谢谢你让我知道它是否解决了你的问题。@AndrewJeromeBernard太好了!请验证并投票表决我的答案。祝你好运
SELECT system.employeeName, system.designation
FROM t2o_mappings AS system
WHERE system.type = ?
  AND system.employeeCompany = ?
  AND NOT EXISTS (
    SELECT NULL
    FROM mappings_view AS app
    WHERE app.employeeName = system.employeeName
      AND app.designation = system.designation
      AND app.type = system.type
      AND app.uNo = ?
      AND app.uCompany = ?
  )
$params = [
    $_GET['type'],
    $_GET['employeeCompany'],
    $_GET['uNo'],
    $_GET['uCompany']
];
$haveSysNoAppResult = sqlsrv_query($conn, $sql, $params);