2011-01-22 31 views
0

想象一下,我正在針對不同的數據庫運行2個查詢。如何過濾數組的行,以便只顯示具有特定值的記錄?

來自源#1的查詢結果將存儲在一個數組中。 來自源#2的查詢結果也將存儲在數組中。

源#2記錄將包含一個外鍵,該外鍵可能與源#1中的ID字段中的特定記錄匹配或不匹配。

因此,如果我要循環訪問源代碼#1,然後我只想顯示匹配源#1 ID的源#2記錄,那麼PHP中有一個方便的命令可以讓我得到過濾結果我每次運行循環時都可以運行一次。

我想避免的是在循環中檢查結果,然後再確定它是否應該顯示(希望內置過濾器命令(如果可用的話,將具有較少的開銷))。

關於在PHP中過濾數組的命令的任何建議?

+0

這兩個數據庫是否在同一個物理服務器實例中?您可以在一些SQL服務器(如MySQL)中跨數據庫邊界運行查詢/連接。 「從...中選擇databasename.tablename.fieldname」是完整的函數語法。如果是這樣的話,你可以在數據庫級別加入表格,讓PHP只顯示結果。 – 2011-01-22 03:09:33

回答

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_filtered,它包含$ array_slaves中匹配外鍵約束的行。

0

這取決於您正在優化的內容。

  • 代碼行:使用array_intersect(由Matt V提及)(可能經過一些預處理後)。
  • 內存/性能:創建一個字典(關聯數組),其中的鍵是源#1的ID。如果內存是問題,則在處理完行後丟棄這些行。值可以是任何東西,比如TRUE。您現在可以使用isset($dict[$id])從源#2過濾數組,該數組運行時間接近恆定。 array_filter在這裏很有用。
相關問題