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
      }
});

看起来比两个 foreach 循环好得多;-)

4

4 回答 4

4

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

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

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

于 2012-12-17T11:33:19.527 回答
3

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

于 2012-12-17T11:43:23.103 回答
0

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

试试这个,对我有用(PHP 5.2.0)。

if ($data != array_unique($data)) {
    echo 'oops, this variable has one or more duplicate item(s)'; die;
}
于 2012-12-17T12:02:08.053 回答
0

这为您提供了一个包含相似项目的数组。对于更大的数据集应该更快:O(2n),字符串连接的额外成本并依靠结果组。由于哈希图,只需要更多的内存。

$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
        }
    }
}
于 2012-12-17T12:38:55.123 回答