2012-04-25 110 views
0

下面是兩個要比較的數組。php數組比較的有效方法

array_a(
[0] => array('userid' => aaa, 'created_time' => XXXX,), 
[1] => array('userid' => bbb, 'created_time' => XXXX,), 
[2] => array('userid' => ccc, 'created_time' => XXXX,) 
) 


array_b(
[0] => array('userid' => aaa, 'created_time' => XXXX,), 
[1] => array('userid' => ccc, 'created_time' => XXXX,), 
[2] => array('userid' => ddd, 'created_time' => XXXX,) 
) 

我想檢索所有符合以下條件的元素: array_a的用戶ID是array_b和 array_a的CREATED_TIME比新array_b的

我使用下面的代碼要做到這一點,但它會採取很長一段時間,如果陣列是巨大的。

for array_a{ 
    for array_b{ 
    if (a[user_id] = b[user_id] && a[created_time] > b[created_time]) { 
     //target got 
    } 
    } 
} 

有什麼辦法可以有效地做這個邏輯嗎?

感謝您的回答。 這些ID是唯一的。如何轉換 array_a( [0] => array('userid'=> aaa,'created_time'=> XXXX,), [1] => array('userid'=> bbb,'created_time'=> XXXX), )

到窗體 陣列(AAA => XXXX,BBB => XXXX) ?

+1

你可以在這裏做的唯一事情就是改變你的數組看起來像'array('aaa'=> XXXX,'bbb'=> XXXX)''。特別是如果你可以在數據獲得這種格式之前做到這一點(這是非常不適合這項工作的)。 – Jon 2012-04-25 08:05:39

+3

如果所有用戶ID都是唯一的,則可以先將數組B映射到'arrayB [user_id] => created_time'。然後你可以迭代數組A並只查找數組B中的用戶ID('O(1)')。那是圍繞'O(2n)'而不是'O(n^2)'。 – 2012-04-25 08:06:23

+0

用戶標識是否按排序順序排列? – Jack 2012-04-25 08:34:07

回答

1
foreach($array_a as $arr) 
    $tmp[$arr['userid']] = $arr['created_time']; //rebulding first array 

foreach($array_b as $arr) 
    if(isset($tmp[$arr['userid']]) && $arr['created_time'] < $tmp[$arr['userid']]){ 
    //target 
    } 

首先,您必須重建一個陣列以適合下一步的結構,您將在其中搜索符合條件的項目。 這個解決方案應該比你的更好,因爲它的循環次數要少得多(2 * n而不是n^2)

+4

那麼,它呢?你在問自己的問題嗎? – Jon 2012-04-25 08:06:00

+0

好吧,我更新了我的懶惰b ******的代碼,希望所有東西都在銀盤上送達(對不起我的英文,我希望你能理解我;) – miro 2012-04-25 08:14:56

+0

對不起,但你的代碼會浪費很多內存做了總計沒什麼用的。你錯過了'created_time'扮演的角色嗎? – Jon 2012-04-25 08:16:51

0

你可以考慮使用每個元素的userid作爲數組鍵。這允許您在O(1)時間內在B中查找正確的項目。

0

按用戶ID對兩個數組進行排序,然後創建時間。訂單仍然是O(N^2),但比較次數大大減少。然而,因爲你正在尋找一個用戶標識的明確匹配,然後將數組轉換爲數組('aaa'=> array(0 =>'created_time',1 =>'created_time'...)),然後獲取array_intersect(array_a,array_b)的值將爲您提供所有常用用戶ID。

0
$b_index = 0; 
for ($a_index = 0; $a_index < count($a); $a_index++) 
{ 
    if ($a[$a_index]['userid'] == $b[$b_index]['userid']) 
    { 
     if ($a[$a_index]['created_time'] >= $b[$b_index]['created_time']) 
      $array[] = $a[$a_index]; 
     $b_index++; 
    } 
} 

如果用戶ID的都以相同的順序進行排序,你不需要每個相比用戶ID的每個用戶ID b中尋找匹配。這應該至少比較少。