通过最后留空/空来对laravel集合进行排序

时间:2017-04-17 10:28:30

标签: php laravel collections usort

似乎无法理解laravel集合的分类,因此empty / null数据最终会成为最后一个。 (对于usort感到困惑)

我所拥有的只是需要订购的times / timestamps。某些行可能没有该列。

我希望数据显示为ASC / ascending,而empty/null数据最后显示。

$collection->sortBy('timestamp')排序很好,但不知道如何处理空字段。

data

表格如下。

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

我从互联网上尝试的随机代码,我无法正常工作。 $sortBy包含要排序的字段名称(因为它可能会更改) 有缺陷的代码处理空/空数据但是它的乱序。 faulty

5 个答案:

答案 0 :(得分:1)

尝试:

$collection->sortBy('-timestamp')

有效吗?

答案 1 :(得分:1)

必须使用带闭包的sort()。下面将对结尾的时间戳ASC进行排序。

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

答案 2 :(得分:0)

我假设你的timestamp是unix时间戳。

你可以这样排序:

$sorted = $collection->sortByDesc('timestamp');

答案 3 :(得分:0)

我有一个类似的问题。在我的情况下,time的{​​{1}}属性可能是$result。它的行为就像NULLNULL(就像0)一样,这是预期的行为。但是我也想通过将int留在最后来对集合进行排序。

NULL

您可以简单地通过返回一个字母顺序比数组中所有其他值高的值来实现此目的。即$collection->sortBy(function ($result) { if ($result['time'] === NULL) { return PHP_INT_MAX; } return $result['time']; }); 是安全的。这样可以确保PHP_INT_MAX等于time的所有结果都在数组的末尾。

答案 4 :(得分:0)

类似于 Mr. Speelman's solution,但作为更短的 PHP 7.4+ 版本:

$collection->sortBy(fn($e) => $e->timestamp ?: PHP_INT_MAX)