2014-01-14 6 views
0

mySQL 테이블의 값을 포함하는 두 개의 배열을 비교 한 다음 두 배열 중 하나에없는 값을 식별해야합니다. 내가 겪고있는 문제는 두 DB 테이블의 필드 이름이 다르다는 것이고 값을 추출하고 두 가지를 비교하는 방법을 고민하는 것입니다.다른 키 이름을 가진 두 배열 비교

나는 이와 관련된 모든 코드를 열거합니다. 누군가가 도움을 줄 수 있기를 바랍니다.

첫째, 데이터

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

이것은 다음과 같은 두 배열 반환에 대한 MySQL의에 대한 초기 호출 :

$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" 
    } 
} 
module 값이

사람이 도움을 줄 수 $indMods 배열의 modname 값에 존재하지 않는 어디 $allMods에서 데이터를 추출 할

?

감사

답변

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

별칭 필드 중 하나 또는 모두를 부여 그래서 그들은 일치 업 키를 현명 :

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

지금 module보다는 modname의 핵심이있다.

비슷한 구조를 가지고있는 한 array_diff을 사용하여 배열 간의 차이점을 찾을 수 있습니다. 귀하의 경우 두 번째 DB 쿼리에서 다른 두 개의 키가 제거됩니다. 예를 들어

: PHP의 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); 

문서 :이 작업을 수행하는 방법에는 여러 가지가 있다는 것을 http://php.net/manual/en/function.array-diff.php

참고. 이것은 단지 하나입니다.