Laravel sort collection and then by key

I think the problem is this:

When you call User::all() you get something like this:

0 => points: 10
1 => points: 50
2 => points: 30
3 => points: 70
4 => points: 20

Then you use the sortBy function, which reorder the collection, but does not reset the keys. So you end up with something like this:

3 => points: 70
1 => points: 50
2 => points: 30
4 => points: 20
0 => points: 10

So using position -1, position, and position +1 makes no sense here.

What you can do is using the values() function, which will reset the keys of you collection:

0 => points: 70
1 => points: 50
2 => points: 30
3 => points: 20
4 => points: 10

So I think the following code would work.

$users = User::all();
$users = $users->sortByDesc(function($item){
    return $item->points()->sum('amount');
})->values();

And then get 3 users from positions - 1 to position + 1:

$myRank = $users->splice($position - 1, 3);

To sort a collection by key, you can sort the backing array by key then recreate the collection again.

 $c = collect(['a' => 1, 'c' => 67, 'b' => 2]);
 $items = $c->all();
 ksort($items);

 $c = collect($items);

Or you can use a macro to get access to the backing array.

 Collection::macro('ksort', function(){
    //macros callbacks are bound to collection so we can safely access
    // protected Collection::items
    ksort($this->items);
    
    return $this;
    //to return a new instance
    //return collect($this->items);
 });

The last solution could be very useful if you are going to need to sort collections by key in many places in your code base


For any sorting array by key, I would suggest native PHP function ksort().


You just need to use the sort collection method:

$c = collect(['a' => 1, 'c' => 67, 'b' => 2]);
$c->sort();

Tags:

Php

Laravel