2013-03-31 71 views
0

我有一個多維數組是這樣的:Fastes方式比較單一維對多維數組在PHP

Array (
[0] => Array 
    (
     [time] => 1364685993 
     [memberid] => 131 
    ) 

[1] => Array 
    (
     [time] => 1364685994 
     [memberid] => 133 
    ) 
[2] => Array 
    (
     [time] => 1364685995 
     [memberid] => 141 
    ) 
) 

和一維數組是這樣的:

Array (
    [0] => 131 
    [1] => 141 
    [2] => 191 
    [3] => 205 
) 

現在我想從多維數組中刪除所有不包含來自正常數組的memberid值的子數組?

在這種情況下,只有Subaray [1]將從多維數組中移除,因爲它的'memberid'鍵值(133)不會在正常數組中顯示。那些數組實際上很大,所以我不確定什麼是最快的方法呢?

+2

數組是否來自數據庫?如果是這樣,請在數據庫上進行過濾,而不是在客戶端上進行過濾。 – knittl

+0

多維數據來自數據庫,但其他數據將來自文件。 – Peter

+1

然後,您應該使用'SELECT'子句在'SELECT'查詢中使用一維數組。例如。 '... memberid IN(131,141,191,205)'。 –

回答

3

首先,我會翻轉$nomal陣列來獲得恆定的查找時間到數組,像這樣:

$normal = array_flip($normal); 

然後,你就必須由$normal陣列與一個簡單的查找過濾$multidimensional_array

$filtered = array_filter($multidimensional_array, function($el) use($normal) { 
    return isset($normal[ $el['member_id'] ]); 
}); 
+0

Dayum,相同的解決方案...:D – deceze

+0

這很有趣...看起來像一個很好的解決方案:) – nickb

+0

你們同時寫了同樣的解決方案。感謝你們兩位。不幸的是,我只能選擇一個答案,所以如果你能得到雙方的共識,這將是很好的:) – Peter

1

目前無法訪問開發資源進行測試,但這應該起作用。

foreach($members as $member => $property) { 
    if (!in_array($property['member_id'], $id_array)) { 
     unset($members[$member]); 
    } 
} 

$id_array是你放在你的問題中的1維矩陣(數組)。

4
$normalArray = array_flip($normalArray); 

$multiDimArray = array_filter($multiDimArray, function ($elem) use ($normalArray) { 
    return isset($normalArray[$elem['memberid']]); 
}); 

需要正好兩個迭代中,一個在每個陣列。使用$normalArray[$elem['memberId']]的關鍵查找速度非常快。由於功能性質和陣列的副本,可能會有一些內存開銷,如果這是個問題,請使用傳統的循環和unset

0

而不是篩選數據庫結果後,您可能想在數據庫查詢本身中使用一維數組。

我們不知道查詢,你使用的是什麼,看起來像,但這些方針的東西會做:

// The ids from the file 
$use_ids = array(131, 141, 191, 205); 

// Create a list for the IN clause 
$ids = '(' . implode(',', $use_ids) . ')'; 

// Create the query 
$query = <<< SQL 
    SELECT time, memberid 
    FROM some_table 
    WHERE ... 
     AND memberid IN {$ids} 
    ORDER BY time 
SQL; 

// Execute the query, etc. 

它始終是一個好主意,讓SQL處理的儘可能多的過濾內容儘可能。