Saltar al contenido

Laravel ordena la colección y luego por clave

Solución:

Creo que el problema es este:

Cuando usted llama User::all() obtienes algo como esto:

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

Luego usa la función sortBy, que reordena la colección, pero no restablece las claves. Entonces terminas con algo como esto:

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

Entonces, usar la posición -1, la posición y la posición +1 no tiene sentido aquí.

Lo que puede hacer es usar la función values ​​(), que restablecerá las claves de su colección:

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

Entonces creo que el siguiente código funcionaría.

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

Y luego obtenga 3 usuarios de las posiciones – 1 a la posición + 1:

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

Para ordenar una colección por clave, puede ordenar la matriz de respaldo por clave y luego volver a crear la colección.

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

 $c = collect($items);

O puede usar una macro para obtener acceso a la matriz de respaldo.

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

La última solución podría ser muy útil si va a necesitar ordenar colecciones por clave en muchos lugares de su base de código.

Para cualquier clasificación array por key, Sugeriría PHP nativo function ksort ().

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *