mercredi 28 novembre 2018

Laravel 5.7: Detecting duplicates in a collection based on multiple keys (done) but how to move dupes to another collection?

I have a huge collection of data (array items). Each item within should be distinguished as dupe if all values for given keys are the same. Imagine this as a unique composite key.

$recordsAll = [
    ['unique1' => 'foo', 'unique2' => 'bar', 'whatever1' => 'whatever1'], // 1st OK
    ['unique1' => 'baz', 'unique2' => 'zaz', 'whatever2' => 'whatever2'], // 2nd OK
    ['unique1' => 'foo', 'unique2' => 'kkk', 'whatever3' => 'whatever3'], // 3rd OK (because unique2 is kkk not bar)
    ['unique1' => 'baz', 'unique2' => 'zaz', 'whatever4' => 'whatever4'], // 4th DUPE (dupe of the 2nd because on both unique1 is bar and unique2 is zaz)
];

In the example above the unique composite key is a combination of unique and unique2.

I'm able to remove the dupes. I do it like that:

$recordsAll = collect($recordsAll);
$recordsCleaned = $recordsAll->unique(function ($item) {
    return $item['unique1'].$item['unique2'];
});

I'm able to confirm that it works by counting results in both. Collection with everything should give me obviously 4, while the cleaned one should give me 3, and they do…

dd($recordsAll->count(), $recordsCleaned->count()); // prints 4 and 3

What I don't know how to do (or at least I have an idea but it does not work) is to store the duped record(s) in another array (collection). So I don't want to only remove the dupes and use cleaned collection. Later I also want to perform some logic on the collection containing dupes.

I thought that a simple diff will do the job for me, since the documentation is quite clear.

The diff method compares the collection against another collection or a plain PHP array based on its values. This method will return the values in the original collection that are not present in the given collection:

$dupes = $recordsAll->diff($recordsCleaned);
$dupes->all();

However this does not work. I tried as well with diffAssoc and diffKeys. Please help me, how I can have the 4th (duped) item and all next dupes in a brand new collection?



via Chebli Mohamed

Aucun commentaire:

Enregistrer un commentaire