2012-12-17 114 views
2

我的目標是在對象數組中找到重複對象,但僅限於特定的對象變量。根據特定鍵在對象數組中找到重複對象

而是使用兩個的foreach循環像下面這樣的,我正在尋找一個更好的(更優雅)的方式找到重複:

foreach ($data as $date) { 
     foreach ($data as $innerDate) { 
      if ($date->birthday == $innerDate->birthday && 
       $date->street == $innerDate->street && 
       $date->streetnr == $innerDate->streetnr && 
       $date->zipcode == $innerDate->zipcode && 
       $date->twinid == $innerDate->twinid && 
       $date !== $innerDate) { 
       // Duple 
     } 
    } 
} 

謝謝!


現在,我使用下面的代碼,根據Tarilo的想法:

usort($data, function($obj_a, $obj_b){ 
     if ($obj_a->birthday == $obj_b->birthday && 
      $obj_a->street == $obj_b->street && 
      $obj_a->streetnr == $obj_b->streetnr && 
      $obj_a->zipcode == $obj_b->zipcode && 
      $obj_a->twinid == $obj_b->twinid) { 
      // Duple 
     } 
}); 

看起來比很多高2的foreach循環;-)

回答

2

您可以在陣列的第一,然後循環數組排序了排序。這樣您只需將當前對象與下一個/上一個對象進行比較。你當前的算法是O(n^2)有效的,但是在排序之後它會是(排序+循環)=(O(log n)+ O(n))。其中n是數組中的對象的數量。

+0

好主意!我想我用'usort()'和一個回調函數來嘗試這個函數,該函數根據變量對數組進行排序。希望這個比兩個foreach循環更快。謝謝! – Tom

+0

我在上面的問題上發佈了我的解決方案。謝謝你的想法。 – Tom

0

因爲$的數據是一個數組,我們可以使用array_ *功能

試試這個,工作在我結束(PHP 5.2.0)。

if ($data != array_unique($data)) { 
    echo 'oops, this variable has one or more duplicate item(s)'; die; 
} 
+0

'array_unique'只適用於整個'$ data',但我只能比較它的一些變量。 – Tom

+0

對不起,我沒有注意到你需要比較一些變量,不是全部。 – Husni

0

這一個給你一個數組與相似的項目。對於較大的數據集,應該更快:O(2n),並且字符串concat需要額外的成本,並計入結果組。由於hashmap只需要多一點內存。

$hashmap = array(); 
foreach ($data as $date) { 
    $hash = $date->zipcode.'-'.$date->street.'-'.$date->streetnr.'-'.$date->birthday.'-'.$date->twinid; 
    if (!array_key_exists($hash, $hashmap)) { 
     $hashmap[$hash] = array(); 
    } 
    $hashmap[$hash][] = $date; 
} 

foreach ($hashmap as $entry) { 
    if (count($entry) > 1) { 
     foreach ($entry as $date) { 
      // $date is a duplicate 
     } 
    } 
} 
相關問題