2017-05-28 32 views
2

所以,我有兩個查詢將從數據庫中提取數據。但是,我需要使用這些數據通過使用php來獲得數組差異。我想將employeeName和名稱都發送到一個數組中,然後獲得差異。我使用的下面的代碼不能按預期工作。任何解決這個問題的方法?如何使用兩個元素的數組獲取數組差異

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

?> 
+0

「我使用的下面的代碼不能按預期工作」,這是什麼意思?什麼不工作? – JazZ

回答

2

你在這裏

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

語法問題的正確方法應該是:

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

array_diff()拋出的通知「數組字符串轉換」,因爲它只能涉及一個維度。 The PHP array_diff() documentation contains this note

注:

兩個因素被認爲是平等的,當且僅當(字符串)$ elem1 ===(字符串)$ elem2時。換句話說:當字符串表示是相同的。

既然您有多維數組進行比較,您可以使用array_filter()函數。

例如:

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

您提供的解決方案是正確的,但它不適用於數組差異函數,我得到的錯誤是「注意:數組到字符串轉換第38行」 –

+0

@AndrewJeromeBernard我編輯了我的答案。謝謝你讓我知道它是否解決了你的問題。 – JazZ

+0

謝謝:D!這工作完美! @JazZ –

0

您可以直接在此查詢數據庫做(相反的檢查是相似的):

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 = ? 
) 

這些問號使其參數化查詢,至極防止SQL注入(參數值不是查詢的一部分,所以它們不能改變它的含義)。你可以使用額外的參數數組來調用它(命令必須匹配):

$params = [ 
    $_GET['type'], 
    $_GET['employeeCompany'], 
    $_GET['uNo'], 
    $_GET['uCompany'] 
]; 
$haveSysNoAppResult = sqlsrv_query($conn, $sql, $params);