2

私の目標は、オブジェクトの配列で重複を見つけることですが、特定のオブジェクト変数に対してのみです。

次のような 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 ループよりもはるかに優れているように見えます ;-)

4

4 に答える 4

4

PHPで関数を試しましたin_array()か??

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

これにより、同様のアイテムがグループ化された配列が得られます。より大きなデータセットの場合は高速になるはずです: 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 に答える
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 に答える