Laravel排序集合然后按键

时间:2015-04-15 08:44:28

标签: php laravel

我正在为我的用户制作raking系统,这是我到目前为止所做的:

获取所有用户并按点对其进行排序 - 它运行正常。

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

在排名中找到你的位置 - 它运作正常

$position = 0;
foreach($users as $user){
    if(Auth::user()->id == $user->id) break;
    $position++;
}

让自己和用户在我之上/之下 - 它不起作用。我得到随机用户。看起来这个集合不再排序了。

$myRank = new Collection();
if($position > 9){
    $myRank->add($users->get($position-1));
    $myRank->add($users->get($position));
    $myRank->add($users->get($position+1));
    return view('rank.show', ['topTen' => $users->take(15), 'myRank' => $myRank]);
}

请帮我解决这个问题,或者给出一些其他方法的暗示(许多记录的重量轻)

4 个答案:

答案 0 :(得分:14)

我认为问题是:

当你致电User::all()时,你会得到类似的结果:

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

然后使用sortBy函数重新排序集合,但不重置键。所以你最终得到这样的东西:

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

所以使用位置-1,位置和位置+1在这里没有任何意义。

你可以做的是使用values()函数,它将重置你的集合的键:

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

所以我认为以下代码可行。

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

然后从位置获得3个用户 - 1到位置+ 1:

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

答案 1 :(得分:7)

要按键排序,您可以获取支持数组,然后重新创建集合。

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

 $c = collect($items);

或者您可以使用宏来访问支持数组。

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

如果您需要在代码库中的许多位置按键对集合进行排序,那么最后一个解决方案可能非常有用

答案 2 :(得分:1)

对于按awk进行的任何排序array,我建议使用原生PHP key ksort()

答案 3 :(得分:1)

你只需要使用排序集合方法:

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