19

I want to use Laravel 5.1 Collection's Unique method to filter unique IDs from nested objects.

Given the data structure

{
  "key1": [
    {"id": 1},
    {"id": 1}
  ],
  "key2": [
    {"id": 1},
    {"id": 2}
  ]
}

I want to return the same datastructure with duplicate id 1 removed from "key 1".

I wanted to use $unique = $collection->unique('id');, but this doesn't seem to apply to a nested datastructure as I have.

So I thought to use $collection

    $input = $request->all();

    $collection = collect($input);

    $collection->each(function($obj, $key) {
        //$key is "key1", "key2"
        //obj is the associated array of objects containing IDs
    })->unique('id');

I don't quite know how to structure this.

The result structure should be:

{
  "key1": [
    {"id": 1}
  ],
  "key2": [
    {"id": 1},
    {"id": 2}
  ]
}
user3871
  • 12,432
  • 33
  • 128
  • 268

4 Answers4

28
$collection = $collection->map(function ($array) {
    return collect($array)->unique('id')->all();
});
Joseph Silber
  • 214,931
  • 59
  • 362
  • 292
8

If your data structure is nested a single level, be it arrays or objects, simple

$unique = $collection->unique('key')

does the job.

Ali Bakhshandeh
  • 433
  • 6
  • 10
3

if you have numeric List then you can use this code

$dataList = [1,2,4,5,3,2,1,98,1,2,4,5,6];

$dataList  = collect( $dataList )->unique();

you will get all the unique list.

[1,2,4,5,3,98,6]
pankaj
  • 1
  • 17
  • 36
0

This should also work, assuming I understood your question correctly and you're just trying to use the innermost value as your unique reference

$unique = $collection->unique('key.id')
liviu blidar
  • 351
  • 4
  • 16