我正在为我的用户制作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]);
}
请帮我解决这个问题,或者给出一些其他方法的暗示(许多记录的重量轻)
答案 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();