maphongba008
maphongba008

Reputation: 2353

Remove key when filter collections laravel

I ran into a problem when using filter with Laravel 5.2, after filtering, I got some unexpected key like "0", "1", "2" ..., how can I remove it?

Before filter:

[
  {
    "id": 1,
    "user_id": 11,
    "location": "1",
    "content": "1",
    "interest_id": 1,
    "longitude": 1,
    "latitude": 1,
    "place_id": "1",
    "created_at": "2016-06-09 15:44:18",
    "updated_at": "2016-06-02 14:28:42",
    "deleted_at": null
  },
  {
    "id": 2,
    "user_id": 12,
    "location": "Forest Lake QLD, Australia",
    "content": "I'm newbie. Hello everybody",
    "interest_id": 1,
    "longitude": 152.9692508,
    "latitude": -27.6236519,
    "place_id": "ChIJB_NHl8hOkWsRMIne81qjAgU",
    "created_at": "2016-06-09 14:28:42",
    "updated_at": "2016-06-09 14:28:42",
    "deleted_at": null
  },
  {
    "id": 8,
    "user_id": 11,
    "location": "Hendra QLD, Australia",
    "content": "What time is it?",
    "interest_id": 1,
    "longitude": 153.0635202,
    "latitude": -27.4225981,
    "place_id": "ChIJAXNg5PBYkWsRIIve81qjAgU",
    "created_at": "2016-06-09 14:28:42",
    "updated_at": "2016-06-09 14:28:42",
    "deleted_at": null
  },
  {
    "id": 9,
    "user_id": 11,
    "location": "Hendra QLD, Australia",
    "content": "Nice Cream!!!!????????",
    "interest_id": 2,
    "longitude": 153.0635202,
    "latitude": -27.4225981,
    "place_id": "ChIJAXNg5PBYkWsRIIve81qjAgU",
    "created_at": "2016-06-09 14:28:42",
    "updated_at": "2016-06-09 14:28:42",
    "deleted_at": null
  },
  {
    "id": 4,
    "user_id": 17,
    "location": "Forest Lake QLD, Úc",
    "content": "Have a nice day!",
    "interest_id": 1,
    "longitude": 152.9692508,
    "latitude": -27.6236519,
    "place_id": "ChIJB_NHl8hOkWsRMIne81qjAgU",
    "created_at": "2016-06-09 14:28:42",
    "updated_at": "2016-06-09 14:28:42",
    "deleted_at": null
  },
  {
    "id": 7,
    "user_id": 18,
    "location": "Hendra QLD, Australia",
    "content": "Where is Kiet Bui? ❤️❤️❤️❤️❤️",
    "interest_id": 1,
    "longitude": 153.0635202,
    "latitude": -27.4225981,
    "place_id": "ChIJAXNg5PBYkWsRIIve81qjAgU",
    "created_at": "2016-06-09 14:28:42",
    "updated_at": "2016-06-09 14:28:42",
    "deleted_at": null
  }
]

After filter, id > 5 for example:

{
  "2": {
    "id": 8,
    "user_id": 11,
    "location": "Hendra QLD, Australia",
    "content": "What time is it?",
    "interest_id": 1,
    "longitude": 153.0635202,
    "latitude": -27.4225981,
    "place_id": "ChIJAXNg5PBYkWsRIIve81qjAgU",
    "created_at": "2016-06-09 14:28:42",
    "updated_at": "2016-06-09 14:28:42",
    "deleted_at": null
  },
  "3": {
    "id": 9,
    "user_id": 11,
    "location": "Hendra QLD, Australia",
    "content": "Nice Cream!!!!????????",
    "interest_id": 2,
    "longitude": 153.0635202,
    "latitude": -27.4225981,
    "place_id": "ChIJAXNg5PBYkWsRIIve81qjAgU",
    "created_at": "2016-06-09 14:28:42",
    "updated_at": "2016-06-09 14:28:42",
    "deleted_at": null
  },
  "5": {
    "id": 7,
    "user_id": 18,
    "location": "Hendra QLD, Australia",
    "content": "Where is Kiet Bui? ❤️❤️❤️❤️❤️",
    "interest_id": 1,
    "longitude": 153.0635202,
    "latitude": -27.4225981,
    "place_id": "ChIJAXNg5PBYkWsRIIve81qjAgU",
    "created_at": "2016-06-09 14:28:42",
    "updated_at": "2016-06-09 14:28:42",
    "deleted_at": null
  }
}

How can I remove the key 2, 3, and 5 in the result and only get an array like before filtering. Any help is appreciate. Edit: My code:

 $result = $result->filter(function ($item) {
                return $item->id > 5;
            })->all();

Upvotes: 42

Views: 45497

Answers (4)

Manuel Eduardo Romero
Manuel Eduardo Romero

Reputation: 891

I had have the same problem when sorting: The example is ordering games result by points and goals. The sorting add key attr in the result. So I use in the final ->values()->all() to get an array values without keys.

Eg:

$sorted = $resultados->sortByDesc('pts')->sortByDesc('gf')->values()->all();

In your case:

$filteredValues = $filtered->values()->all();

I hope it helps you.

Upvotes: 5

mace
mace

Reputation: 1018

Try adding values()

$result = $result->filter(function ($item) {
                return $item->id > 5;
            })->values()->all();

Upvotes: 98

rome 웃
rome 웃

Reputation: 1901

$result = $result->filter(function ($item) {
                return $item->id < 5;
            })->all();

Enjoy !!

        $collection = collect([1, 2, 3, 4]);

        $filtered = $collection->filter(function ($item) {
            return $item < 2;
        });

        $filtered->all();
        return $filtered;

result: [ 1 ]

But:

    $collection = collect([1, 2, 3, 4]);

    $filtered = $collection->filter(function ($item) {
        return $item > 2;
    });

    $filtered->all();
    return $filtered;

Result: { "2": 3, "3": 4 }

don't know how, why...

Upvotes: 1

Alexey Mezenin
Alexey Mezenin

Reputation: 163938

You can't do that if you want to use filter() helper, because that's just how this helper works. I mean there are no parameters or something for this method. You can only rebuild returned collection.

Or, you can use filter() method code to create your own helper, like myFilter() and modify it a bit, for example:

public function myFilter(callable $callback)
{
    $return = [];

    foreach ($this->items as $key => $value) {
        if ($callback($value, $key)) {
            // $return[$key] = $value; // original line from filter() method
            $return[] = $value; // Here you want to remove $key
        }
    }

    return new static($return);
}

Or you could just use collection with indices. I mean usually you're using collection to iterate over it and these indices won't disturb you.

Upvotes: 1

Related Questions