Encontre duplicatas na matriz de objects com base em chaves específicas

meu objective é encontrar duplicatas em uma série de objects, mas apenas para variables ​​de object específicas.

Em vez de usar dois foreach-loops como o seguinte, procuro uma maneira melhor (mais elegante) de encontrar as duplicatas:

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

Obrigado!


Agora, estou usando o código seguinte, com base na idéia de 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 } }); 

Parece muito melhor do que dois foreach-Loops 😉

Você pode classificar a matriz primeiro e, em seguida, fazer o loop sobre a matriz ordenada. Desta forma, você só precisa comparar o object atual com o object seguinte / anterior. Seu algoritmo atual é O (n ^ 2) eficiente, mas após a sorting seria (ordenando + looping) = (O (log n) + O (n)) eficiente. Onde n é o número de objects em sua matriz.

Você tentou in_array() function em php ??

Para mais referência sobre in_array (), use esta URL

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

Como $ data é uma matriz, podemos usar a function array_ *

Experimente isso, funciona no meu final (PHP 5.2.0).

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

Este oferece uma matriz com itens semelhantes agrupados. Deve ser mais rápido para conjuntos de dados maiores: O (2n) com custo adicional para string concat e contar com grupos resultantes. Basta um pouco mais de memory por causa do 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 } } }