2015-04-15 103 views
5

我正在爲我的用戶製作耙系統,這裏是我到目前爲止:Laravel排序收集,然後按鍵

獲取所有用戶並按點排序 - 它工作正常。

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

請幫我這一個或給出另一種方法的一些提示(用於多條記錄重量輕)

回答

10

我認爲這個問題是這樣的:

當你調用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在這裏沒有意義。

什麼,你可以使用值()函數,這將重置您收集的鑰匙做:

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); 
+0

我想你可以延長,則集合類調用ksort支持數組上。非常骯髒的黑客雖然 – peter

0

對於任何通過key排序array,我建議本機PHP functionksort()

5

要按鍵排序,您可以獲取支持數組,然後重新創建該集合。

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

最後的解決方案是非常有用的,如果你將需要在你的代碼庫,許多地方通過鍵集合排序

+0

此問題已被回答。兩年前。 – zarcel

+8

@zarcel雖然它出現在谷歌,這不僅僅是爲了你的利益。 – ash

+0

我同意,即使問題與提問者無關,其他人也可能會找到有用的答案。另外,兩年後可能會出現新的解決方案。 – Dragas