2011-01-22 4 views
0

다른 데이터베이스에 대해 각각 2 개의 쿼리를 실행한다고 가정 해보십시오.특정 값의 레코드 만 표시되도록 배열의 행을 필터링하는 방법은 무엇입니까?

원본 # 1의 쿼리 결과가 배열에 저장됩니다. 소스 # 2의 쿼리 결과도 배열에 저장됩니다.

원본 # 2 레코드에는 원본 # 1의 ID 필드에있는 특정 레코드와 일치하거나 일치하지 않을 수있는 외래 키가 포함됩니다.

소스 # 1을 반복 한 다음 소스 # 1의 ID와 일치하는 소스 # 2 레코드 만 표시하려면 PHP에서 필터링 된 결과를 얻을 수있는 편리한 명령이 있어야합니다 루프를 실행할 때마다 한 번씩 실행할 수 있습니다.

필자가 피하고자하는 바는 루프 내에서 루프를 사용하여 결과를 확인한 후에 표시해야하는지 결정하기 전에 (가능한 경우 필터 명령이 내장되어 있으면 오버 헤드가 적어지기를 바랍니다).

PHP에서 배열을 필터링하는 명령에 대한 제안 사항이 있습니까?

+0

두 개의 데이터베이스가 동일한 실제 서버 인스턴스 내에 있습니까? MySQL과 같은 일부 SQL Server에서 데이터베이스 경계를 ​​넘어 쿼리/조인을 실행할 수 있습니다. "select databasename.tablename.fieldname from ..."은 완전한 기능을하는 구문입니다. 그렇다면 데이터베이스 수준에서 테이블에 가입하고 결과를 표시하기 위해 PHP 만 남겨 둘 수 있습니다. –

답변

0

주어진 배열의 행은 객체 또는 배열입니다. 배열 요소는 스칼라 값이 아니기 때문에 전체 결과 배열에서 array_intersect를 실행할 수 없습니다.

하나의 루프를 만들어 기본 키 인덱스를 저장 한 다음 함수가 유효한 통신을 검사 할 array_filter를 호출합니다.

global $aIds; 
$aIds = array(); 

foreach($array_masters as $item) { 
    $aIds[] = $item->master_id; 
} 

function filter_correspondant($row) { 
    global $aIds; 
    return in_array($row->slave_id, $aIds); 
} 

$array_slaves_filtered = array_filter($array_slaves, 'filter_correspondant'); 

위의 스 니펫에서 두 배열은 $ array_masters 및 $ array_slaves입니다. 생성 된 교차 배열은 외래 키 제약 조건과 일치하는 $ array_slaves의 행을 포함하는 $ array_slaves_filtered입니다.

0

최적화 대상에 따라 다릅니다.

  • 코드 줄 : Matt V에서 언급 한대로 array_intersect를 사용할 수 있습니다 (일부 사전 처리 후 가능).
  • 메모리/성능 : 키가 소스 # 1의 ID 인 사전 (연관 배열)을 만듭니다. 메모리가 문제가되면 처리 된 행을 삭제하십시오. 값은 무엇이든 가능합니다 (예 : TRUE). 이제 일정한 시간 내에 실행되는 isset($dict[$id])을 사용하여 소스 # 2에서 배열을 필터링 할 수 있습니다. array_filter은 여기에서 유용 할 수 있습니다.
관련 문제