Sorting laravel collection by leaving null/empty l

2019-07-25 14:08发布

Can't seem to get my head around of sorting laravel collection so empty / null data would end up being last. ( bit confused about usort )

Pretty much all I have is bunch of times / timestamps that need to be ordered. Some rows may not have for that column.

I would like data to appear ASC / ascending while empty/null data is shown last.

$collection->sortBy('timestamp') sorts nicely but doesn't know how to deal with empty fields.

data

Table looks like this.

   $data = $data->sort(function($a, $b) use ($sortBy) {
        if ($a->{$sortBy} and $b->{$sortBy}) return 0; 
        return ($a->{$sortBy} > $b->{$sortBy}) ? -1 : 1;
    }); 

Random code I tried from the internet, which I can't get to work correctly. $sortBy contains a field name to sort by ( since it may change ) Faulty code deals with empty / null data but its out of order. faulty

3条回答
Emotional °昔
2楼-- · 2019-07-25 14:31

Try:

$collection->sortBy('-timestamp')

Does it work?

查看更多
乱世女痞
3楼-- · 2019-07-25 14:47

I assume your timestamp is unix timestamp.

You can sort it like this :

$sorted = $collection->sortByDesc('timestamp');
查看更多
Juvenile、少年°
4楼-- · 2019-07-25 14:50

Have to use sort() with a closure. Below will sort timestamp ASC with NULL at the end.

$sorted = $collection->sort(function ($a, $b) {
    if (!$a->timestamp) {
        return !$b->timestamp ? 0 : 1;
    }
    if (!$b->timestamp) {
        return -1;
    }
    if ($a->timestamp == $b->timestamp) {
        return 0;
    }

    return $a->timestamp < $b->timestamp ? -1 : 1;
});
查看更多
登录 后发表回答