2011-01-22 14 views
0

私は、それぞれ異なるデータベースに対して2つのクエリを実行しているとします。特定の値を持つレコードだけが表示されるように、配列の行をフィルタリングするにはどうすればよいですか?

ソース#1のクエリ結果は配列に格納されます。 ソース#2のクエリ結果も配列に格納されます。

ソース#2レコードには、ソース#1のIDフィールドの特定のレコードと一致するかどうかにかかわらず、外部キーが含まれます。

ソース#1をループして、ソース#1のIDと一致するソース#2レコードのみを表示したいのであれば、PHP内でフィルタリングされた結果を得るための便利なコマンドがあります私はループを走らせるたびに一度走れると思っていました。

私が避けたいのは、表示する必要があるかどうかを判断する前にループ内でループをループしていることです。

PHP内の配列をフィルタリングするコマンドに関する提案はありますか?

+0

これらの2つのデータベースは、同じ物理サーバーインスタンス内にありますか? MySQLのようないくつかのSQLサーバでは、データベースの境界を越えてクエリ/ジョインを実行できます。 "select databasename.tablename.fieldname from ..."は完全に機能する構文です。その場合、データベースレベルでテーブルに参加し、結果を表示するだけでPHPを残すことができます。 –

答えて

0

特定の配列内の行は、オブジェクトまたは配列のいずれかです。配列要素はスカラ値ではないので、結果配列全体に対してarray_intersectを実行することはできません。

プライマリキーインデックスを格納するループを1つ作成してから、関数が有効な対応をチェックする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'); 

上記のスニペットでは、2つの配列は$ array_mastersと$ array_slavesです。生成された交差配列は$ array_slaves_filteredで、これは外部キー制約に一致する$ array_slavesの行を含みます。

0

これは最適化対象によって異なります。

  • コード行:Matt Vが述べたようにarray_intersectを使用することがあります(場合によっては前処理をした可能性もあります)。
  • メモリ/パフォーマンス:キーがソース#1のIDである辞書(連想配列)を作成します。メモリーが問題であれば、処理された行を破棄してください。値は何でもかまいません(TRUEなど)。ほぼ一定の時間内に実行されるisset($dict[$id])を使用して、ソース#2から配列をフィルタリングできるようになりました。 array_filterはここで便利です。
関連する問題