似乎无法理解laravel集合的分类,因此empty
/ null
数据最终会成为最后一个。 (对于usort感到困惑)
我所拥有的只是需要订购的times
/ timestamps
。某些行可能没有该列。
我希望数据显示为ASC
/ ascending
,而empty/null
数据最后显示。
$collection->sortBy('timestamp')
排序很好,但不知道如何处理空字段。
表格如下。
$data = $data->sort(function($a, $b) use ($sortBy) {
if ($a->{$sortBy} and $b->{$sortBy}) return 0;
return ($a->{$sortBy} > $b->{$sortBy}) ? -1 : 1;
});
我从互联网上尝试的随机代码,我无法正常工作。
$sortBy
包含要排序的字段名称(因为它可能会更改)
有缺陷的代码处理空/空数据但是它的乱序。
答案 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
。它的行为就像NULL
是NULL
(就像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)