2012-03-05 74 views
1

我有兩個數組我需要比較....比較兩個陣列將數據保存到比賽

$飲料陣列

(
[0] => Drink Object 
    (
     [top_id] => 40C6-88 
     [name] => Pepsi 
     [drink_id] => E936 
    ) 

[1] => Drink Object 
    (
     [top_id] => 46DB-9E 
     [name] => Orange Juice 
     [drink_id] => E936 
    ) 
) 

[2] => Drink Object 
    (
     [top_id] => 5J71-4F79 
     [name] => Dr Pepper  
     [drink_id] => E936 
    ) 

$ DrinkItem陣列

(
[0] => DrinkItem Object 
    (
     [bottom_id] => 45BD-92DD 
     [name] => Diet Coke  
     [drink_template_id] => 3B2A-4D82 
    ) 

[1] => DrinkItem Object 
    (
     [bottom_id] => 4A71-8F79 
     [name] => Orange Juice  
     [drink_template_id] => 3B2A-4D82 
    ) 


) 

..如果名稱與DrinkItem Array中的其中一個名稱匹配我需要存儲該項目的top_id。

我試圖做這樣的事情:

foreach ($Drink as $d) { 
    foreach ($DrinkItem as $item){ 
     if ($d->name == $item->name){ 
      $match = $d->top_id; 
     } 
    } 
} 

但我可能是大錯特錯這裏。如果有更好的方法來存儲匹配的ID,或者如果我在正確的軌道上,任何幫助都非常感謝!

+0

由於數組內部有對象,這些循環是我想到的唯一解決方案。您可能希望從數組中刪除匹配以縮短循環。 – Corubba 2012-03-05 01:26:51

+0

您是否需要查找符合條件的所有「top_id」? – Irfy 2012-03-05 01:27:14

+1

你在正確的軌道上,但這不是最有效率的解決方案。它將在[O(n^2)時間](http://en.wikipedia.org/wiki/Big_O_notation)中執行。如果效率很重要,那麼讓我知道,我可能會給你一個更好的解決方案。否則,爲了讓它簡單易懂,有一些東西需要說明。 注:我的替代解決方案可能會處理哈希。降低內存效率,有利於提高時間效率。 – ShaneC 2012-03-05 01:28:54

回答

2

你可能會更好先創建一個索引:如果您需要整個Drink對象並不僅僅是top_id,可以考慮使用數組路口,像這樣

$drinkindex = array(); 

// Note that names need to be unique. 
foreach ($Drink as $d) { 
    $drinkindex[$d->name] = $d->top_id; 
} 

$matches = array(); 
foreach ($DrinkItem as $di) { 
    $match = $drinkindex[$di->name]; 
    if ($match!==NULL) { 
     $matches[$match] = True; 
    } 
} 

// $matches is a set of top_id. 
// If you may have duplicates and you want those represented, use a list instead. 

function namecompare($a, $b) { 
    if ($a->name === $b->name) { 
     return 0; 
    } else { 
     return ($a->name < $b->name) ? -1: 1; 
    } 
} 

$intersection = array_uintersect($Drink, $Drinkitem, 'namecompare'); 

var_dump($intersection); // contains $Drink[1]; 
+0

弗朗西斯阿維拉=我的英雄。非常感謝一個男人,遠遠超越。非常有幫助! – mstef 2012-03-05 02:01:59

1

你方法顯然是O(n*m)

nm表示陣列$Drink$DrinkItem的長度。

假設您有權訪問基於散列的插入/提取性能的基於散列的映射,您可以在O(n + m)時間內解決問題。

  1. 初始化一個空映射和一個空列表。
  2. 遍歷$Drink數組並將每個對象存儲在地圖中,並使用其name作爲關鍵字。
  3. 遍歷到$DrinkItem和每個$drink_item,檢查$drink_item->name是否映射到地圖中的Drink對象。
    • 如果是這樣,請將映射的Drink對象的top_id添加到列表中。

列表包含top_id s,而你在O(n+m)時間得到了他們。

編輯:弗朗西斯阿維拉的帖子包含實際的PHP代碼,正是這樣做。

+0

謝謝Irfy! (實際上非​​常有幫助,看到這種破敗,然後看到它在行動) – mstef 2012-03-05 02:00:09