根据特定键在对象数组中查找重复项

时间:2012-12-17 11:26:02

标签: php arrays duplicates

我的目标是在对象数组中找到重复项,但仅限于特定的对象变量。

我没有像以下那样使用两个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
      }
});

看起来好于两个foreach-Loops; - )

4 个答案:

答案 0 :(得分:3)

你在php中试过in_array()函数吗?

有关in_array()的更多参考,请使用此URL

http://php.net/manual/fr/function.in-array.php

答案 1 :(得分:2)

您可以先对数组进行排序,然后遍历已排序的数组。这样,您只需要将当前对象与下一个/上一个对象进行比较。您当前的算法效率为O(n ^ 2),但在排序后它将(排序+循环)=(O(log n)+ O(n))有效。其中n是数组中对象的数量。

答案 2 :(得分:0)

由于$ data是一个数组,我们可以使用array_ * function

试试这个,适用于我的目的(PHP 5.2.0)。

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

答案 3 :(得分:0)

这个给你一个包含类似项目的数组。对于更大的数据集应该更快:O(2n),字符串连续的额外成本和计数结果组。由于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
        }
    }
}